Trouver tous les postes de sous-chaîne dans une chaîne plus longue en C#
J'ai une grande chaîne j'ai besoin d'analyser, et j'ai besoin de trouver toutes les occurrences de extract"(me,i-have lots. of]punctuation
, et stocker l'index de chaque de une liste.
Donc, dire que ce morceau de ficelle était dans le début et le milieu de la plus grande chaîne, les deux d'entre eux seraient trouvés, et leur index sont susceptibles d'être ajoutés à la List
. et le List
contiendrait 0
et l'autre indice de ce qu'il serait.
J'ai été jouer, et le string.IndexOf
ne presque ce que je cherche, et j'ai écrit certains de code mais ça ne marche pas et j'ai été incapable de comprendre exactement ce qui est faux:
List<int> inst = new List<int>();
int index = 0;
while (index < source.LastIndexOf("extract\"(me,i-have lots. of]punctuation", 0) + 39)
{
int src = source.IndexOf("extract\"(me,i-have lots. of]punctuation", index);
inst.Add(src);
index = src + 40;
}
inst
= La listesource
= La grande chaîne de
Toutes les meilleures idées?
Vous devez vous connecter pour publier un commentaire.
Voici un exemple de la méthode d'extension pour elle:
Si vous mettez cela dans une classe statique et importer l'espace de noms avec
using
, il apparaît comme une méthode sur n'importe quelle chaîne, et vous pouvez le faire:Pour plus d'informations sur les méthodes d'extension, http://msdn.microsoft.com/en-us/library/bb383977.aspx
Aussi le même à l'aide d'un itérateur:
yield
vais faire le code "paresseux". Il ne sera pas recueillir tous les indices dans une liste en mémoire à l'intérieur de la méthode. Ce genre de pratique à l'effet qu'il a sur la performance dépend de beaucoup de facteurs.value.Length
vous risquez de manquer imbriqués les matchs! Exemple: "C'est un NestedNestedNested match test!" avec correspondance pour "NestedNested" permet de trouver un seul indice, mais pas imbriquées l'une. Pour résoudre ce juste ajouter+=1
en boucle au lieu de+=value.Length
.Pourquoi ne pas utiliser le construit en classe RegEx:
Si vous avez besoin de réutiliser l'expression puis de les compiler et de les mettre en cache quelque part. Modifier la matchString param pour une Regex matchExpression dans une autre surcharge pour la réutilisation de cas.
indexes
? Ce n'est pas définie n'importe où.à l'aide de LINQ
Version polie + cas en ignorant support:
L'appeler comme ceci:
Salut belle réponse par @Matti Virkkunen
Mais cela couvre les cas de test comme AOOAOOA
où la sous-chaîne
sont AOOA et AOOA
Sortie 0 et 3
Sans Regex, à l'aide de comparaison de chaînes de caractères de type:
Cela renvoie {3,8,19,22}. Modèle vide correspondent à tous les postes.
Pour plusieurs motifs:
Ce retourne {3, 8, 19, 22, 15, 16}
J'ai remarqué qu'au moins deux solutions proposées n'est pas gérer le chevauchement des résultats de recherche. Je n'ai pas vérifier l'un marqué avec la coche verte. Ici est celui qui traite le chevauchement des résultats de recherche:
Basé sur le code que j'ai utilisé pour trouver les occurrences d'une chaîne dans une chaîne plus longue, votre code devrait ressembler à:
@csam est correct en théorie, bien que son code ne sera pas complie et peut être refractored à
J'ai trouvé ce exemple et intégrés dans une fonction:
Retourne:
53 trouvé à la position 2
78 trouvé à la position 4
78 trouvé à la position 7
57 n'est pas dans 153786