À moins que je ne manque une méthode intégrée évidente, quel est le moyen le plus rapide d'obtenir la n ième occurrence d'une chaîne dans une chaîne?
Je me rends compte que je pourrais boucler la méthode IndexOf en mettant à jour son index de démarrage à chaque itération de la boucle. Mais faire cela de cette façon me semble un gaspillage.
Réponses:
C'est essentiellement ce que vous devez faire - ou du moins, c'est la solution la plus simple. Tout ce que vous «gaspilleriez», c'est le coût des invocations de méthodes n - vous ne vérifierez aucun cas deux fois, si vous y réfléchissez. (IndexOf reviendra dès qu'il trouvera la correspondance, et vous continuerez à partir de là où il s'est arrêté.)
la source
StringUtils.ordinalIndexOf()
. C # avec tous les Linq et d'autres fonctionnalités merveilleuses, n'a tout simplement pas de support intégré pour cela. Et oui, il est très impératif d'avoir son support si vous avez affaire à des analyseurs et des tokenizers.string
:)Vous pouvez vraiment utiliser l'expression régulière
/((s).*?){n}/
pour rechercher la n-ième occurrence de sous-chaînes
.En C #, cela pourrait ressembler à ceci:
Remarque: j'ai ajouté
Regex.Escape
à la solution originale pour permettre la recherche de caractères qui ont une signification particulière pour le moteur regex.la source
value
? Dans mon cas, je cherchais un point msdn.microsoft.com/en-us/libraryVoici l'implémentation récursive (de l' idée ci-dessus ) en tant que méthode d'extension, imitant le format de la ou des méthodes du framework:
Aussi, voici quelques tests unitaires (MBUnit) qui pourraient vous aider (pour prouver qu'il est correct):
la source
ou en C # avec des méthodes d'extension
la source
index
initialement sur -1."BOB".IndexOf("B")
retourne 0, cette fonction devrait donc l'être pourIndexOfOccurence("BOB", "B", 1)
IndexOfOccurence
ne vérifie pas sis
estnull
. Et String.IndexOf (String, Int32) lanceraArgumentNullException
simatch
estnull
.Peut-être que ce serait également bien de travailler avec la
String.Split()
méthode et de vérifier si l'occurrence demandée est dans le tableau, si vous n'avez pas besoin de l'index, mais de la valeur à l'indexla source
Après quelques analyses comparatives, cela semble être la solution la plus simple et la plus efficace
la source
System.ValueTuple ftw:
var index = line.Select((x, i) => (x, i)).Where(x => x.Item1 == '"').ElementAt(5).Item2;
écrire une fonction à partir de là est un devoir
la source
La réponse de Tod peut être quelque peu simplifiée.
Production
la source
Ou quelque chose comme ça avec la boucle do while
la source
Cela pourrait le faire:
la source