Obtenir l'index de la n-ième occurrence d'une chaîne de caractères?
Sauf si je suis en manque évident de la méthode intégrée, ce qui est le moyen le plus rapide pour obtenir le nth occurrence d'une chaîne dans une chaîne de caractères?
Je me rends compte que je pouvais boucle de la IndexOf par la méthode de mise à jour de son index de début de chaque itération de la boucle. Mais cette façon de faire semble un gaspillage de moi.
- Je voudrais utiliser une des expressions régulières pour pas que vous devez voie optimale correspondant à la chaîne de caractères dans la chaîne. Ce dans l'une des belles DSLs nous devrions tous utiliser lorsque cela est possible. Un exemple dans VB.net le code est presque la même en C#.
- Je place beaucoup d'argent sur les expressions régulières version nettement plus difficile d'obtenir le droit de "garder la boucle et faire simple Chaîne de caractères.IndexOf". Les expressions régulières ont leur place, mais ne doit pas être utilisé lorsque des alternatives plus simples existent.
- Similaire: stackoverflow.com/a/9908392/1305911
Vous devez vous connecter pour publier un commentaire.
C'est en gros ce que vous devez faire - ou du moins, c'est la solution la plus simple. Tous vous seriez "perdre" est le coût de n appels de méthode - vous n'allez pas être la vérification de tous les cas deux fois, si vous pensez à ce sujet. (IndexOf sera de retour dès qu'il trouve le match, et vous allez continuer à aller de l'endroit où il l'avait laissé.)
StringUtils.ordinalIndexOf()
. C# avec tous les Linq et d'autres caractéristiques merveilleuses, n'a tout simplement pas d'un bâti-support pour cela. Et oui, il est très impératif de disposer de son soutien si vous travaillez avec des analyseurs et des générateurs de jetons.string
🙂Vous ne pouvais vraiment utiliser l'expression régulière
/((s).*?){n}/
à la recherche pour la n-ième occurrence de la sous-chaînes
.En C# il pourrait ressembler à ceci:
Remarque: j'ai ajouté
Regex.Escape
à solution originale pour permettre la recherche des caractères qui ont une signification particulière pour moteur d'expressions régulières.value
? Dans mon cas, je cherchais un point msdn.microsoft.com/en-us/library/...Voici le récursive de mise en œuvre (ci-dessus idée) comme une extension de la méthode, mimicing le format de la méthode du cadre(s):
Aussi, voici quelques (MBUnit) tests unitaires qui pourrait vous aider (pour prouver qu'il est correct):
ou en C# avec les méthodes d'extension
index
d'abord à -1."BOB".IndexOf("B")
retourne 0, donc si cette fonction pourIndexOfOccurence("BOB", "B", 1)
IndexOfOccurence
de ne pas vérifier sis
estnull
. Et Chaîne de caractères.IndexOf (String, Int32) jetezArgumentNullException
simatch
estnull
.Peut-être qu'il serait bien aussi de travailler avec les
String.Split()
Méthode et de vérifier si l'événement est dans le tableau, si vous n'avez pas besoin de l'index, mais la valeur à l'indexAprès quelques benchmarking, ce qui semble être la plus simple et la plus efficace solution
Système.ValueTuple ftw:
var index = line.Select((x, i) => (x, i)).Where(x => x.Item1 == '"').ElementAt(5).Item2;
l'écriture d'une fonction de qui est les devoirs
Tod's réponse peut être quelque peu simplifié.
Sortie
Cela pourrait le faire: