2010-11-07 4 views
0

Comment rechercher une unité répétée dans une longue chaîne?Comment rechercher une unité répétée dans une longue chaîne en utilisant C#

string foo = "atccuahhqtccuahh"; 

Avec une sous-chaîne répétée de ccuahh, comment puis-je déterminer la position où la répétition se produire en utilisant regex?


Merci les gars. Mais le code affiché ne fonctionne pas. Je suis à la recherche de tout type de répétition dans une chaîne. Quelqu'un peut poster un code testé pour m'aider? Merci beaucoup.

+0

Savez-vous ce qui est une sous-chaîne répétée? –

+0

Existe-t-il d'autres restrictions ou exigences sur quels constituants une unité répétée? Par exemple. Voulez-vous seulement la plus longue chaîne répétée possible? Voulez-vous que toutes les cordes répétées soient plus longues qu'une longueur minimale? Dans votre exemple voudriez-vous aussi "tccuahh"?Les cordes répétées peuvent-elles être adjacentes ou sont-elles séparées par d'autres caractères? –

Répondre

0

Qu'en est-il de l'utilisation de LINQ?

 string text = "aafffuaffuaffuafffua"; 
     string search = "fff"; 

     var byLinq = from i in Enumerable.Range(0, text.Length) 
        where text.Length - i - search.Length > 0 
        where text.Substring(i, search.Length) == search 
        select i; 
1

Utilisez la surcharge string.IndexOf (string, int). Commencez par l'argument startIndex à 0, vous obtiendrez l'index de la première correspondance. Boucle, passez maintenant cet index trouvé + 1 pour l'argument.

Si vous voulez coller avec Regex, utilisez la propriété Match.Index.

var matches = Regex.Matches("atccuahhqtccuahh", "ccuahh"); 
var indices = matches.OfType<Match>().Select((m) => m.Index); 
+0

C'est utile quand OP connaît la chaîne répétée –

0

Pourquoi voulez-vous utiliser regex? D'un rapide coup d'œil, il semble que vous pouvez le faire facilement avec seulement les méthodes normales de chaînes:

int GetIndexOfFirstRepetition(string text, string substring){ 
    var firstOccurrenceIndex = text.IndexOf(substring); 

    var indexToSearchAfter = firstOccurrenceIndex + substring.Length; 

    return text.IndexOf(substring, indexToSearchAfter); 
} 

Je suppose que la sous-chaîne est en fait répété, et que par « trouver la position où la répétition est arrivé » vous voulez que la deuxième occurrence de la sous-chaîne, pas la première.

1

Vous pouvez utiliser un Regex avec le regroupement. "(. +)" Crée un groupe de correspondance pour un ou plusieurs caractères et représente l'unité répétée. Cela devra être ajusté en fonction du nombre minimum de caractères que vous voulez que l'unité répétée ait. Par exemple. remplacez le '+' dans le groupe de correspondance par '{x,}' où x est le nombre minimum de caractères.

Le "\ 1" correspond aux mêmes caractères correspondant à "(. +)";

Code d'essai:

string input = "atccuahhqtccuahh"; 
Regex r = new Regex(@"(.+).*\1"); 

foreach (Match match in r.Matches(input)) 
{ 
    Console.WriteLine(match.Index); 
    Console.WriteLine(match); 

GroupCollection groups = match.Groups; 
Console.WriteLine("'{0}' repeated at positions {1} and {2}", 
    groups[0].Value, 
    groups[0].Index, 
    groups[1].Index); 
} 
+0

La correspondance de modèle n'est pas correcte. Le \ 1 correspond exactement aux mêmes caractères (au même index) que le groupe correspond. –

+0

Je soupçonne que soit un lookahead positif ou négatif est nécessaire pour s'assurer que les indices des groupes diffèrent. Par exemple. new Regex (@ "(([a-z]) (? =. * \ 2)) +"); –

1

Je suppose que vous êtes à la recherche actuall reg exp. Voici celui qui devrait fonctionner:

Regex re = new Regex(@"(.+).+?\1"); 

Cependant, cela fonctionne un peu weired. Pour le match string (celui que vous avez utilisé comme exemple) que je devais écrire cette façon:

Regex re = new Regex(@"(.{3,}).+?\1"); 

Sans spécification explicite limite amant elle correspondait « a » et « hh » seulement.

probablement me manque quelque chose sur la façon dont fonctionne Regex dans .NET ...

Questions connexes