Question

Je n'arrive pas à trouver de réponse à ce problème et je me demande s’il en existe une. Exemple simplifié:

Considérez une chaîne "nnnnn" où je souhaite trouver toutes les correspondances de "nn". - mais aussi ceux qui se chevauchent. Donc, la regex fournirait les 3 correspondances suivantes:

  1. nn nn
  2. n nn n
  3. nn nn

Je réalise que ce n’est pas exactement ce à quoi servent les expressions rationnelles, mais parcourir la chaîne et l’analyser manuellement ressemble à une énorme quantité de code, étant donné qu’en réalité, les correspondances doivent être effectuées à l’aide d’un motif, et non d’une chaîne littérale. .

Était-ce utile?

La solution

Une solution possible pourrait être d'utiliser un un regard positif derrière :

(?<=n)n

Cela vous donnerait la position finale de:

  1. * n *** n ** nn & nbsp;
  2. n * n *** n ** n & nbsp;
  3. nn * n *** n **

Comme mentionné par Timothy Khouri , un lookahead positif est plus intuitif

Je préférerais à sa proposition (? = nn) n la forme la plus simple:

(n)(?=(n))

Cela ferait référence à la première position des chaînes de votre choix et capturerait le deuxième n du groupe (2) .

C’est vrai parce que:

  • Toute expression régulière valide peut être utilisée dans le préfixe.
  • S'il contient des parenthèses de capture, les références arrières seront enregistrées .

Ainsi, group (1) et group (2) captureront tout ce que représente 'n' (même s'il s'agit d'une regex compliquée).

Autres conseils

Utiliser un lookahead avec un groupe de capture fonctionne, au détriment de rendre votre regex plus lente et plus compliquée. Une autre solution consiste à indiquer à la méthode Regex.Match () où la prochaine tentative de correspondance doit commencer. Essayez ceci:

Regex regexObj = new Regex("nn");
Match matchObj = regexObj.Match(subjectString);
while (matchObj.Success) {
    matchObj = regexObj.Match(subjectString, matchObj.Index + 1); 
}

D'après ce que j'en sais, il n'y a pas de moyen purement regex de le faire en une fois (c'est-à-dire, en retournant les trois captures que vous demandez sans boucle).

Maintenant, vous pouvez trouver un motif une seule fois et lancer la recherche en commençant par l'offset (position trouvée + 1). Devrait combiner l'utilisation de regex avec un code simple.

[EDIT] Super, je suis rétrogradé quand j’ai dit ce que Jan a montré ...
[EDIT 2] Pour être clair: la réponse de Jan est meilleure. Pas plus précis, mais certainement plus détaillé, il mérite d'être choisi. Je ne comprends tout simplement pas pourquoi le mien est rejeté, car je ne vois toujours rien d’inconvénient. Pas un gros problème, juste ennuyeux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top