Frage

Ich kann nicht scheinen, um eine Antwort auf dieses Problem zu finden, und ich frage mich, wenn ein solches vorhanden ist. Vereinfachtes Beispiel:

Betrachten Sie eine Zeichenfolge „nnnn“, wo ich alle Spiele von „nn“ finden wollen - aber auch solche, die einander überlappen. So ist der Regex würde die folgenden 3 Treffer:

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

Ich weiß, das ist nicht genau das, was reguläre Ausdrücke für gemeint sind, aber die Zeichenfolge zu Fuß und Parsen dies scheint manuell wie eine ganze Menge Code, dass die Spiele in Wirklichkeit unter Berücksichtigung hätten getan werden, um ein Muster verwendet wird, nicht eine wörtliche Zeichenfolge .

War es hilfreich?

Lösung

Eine mögliche Lösung könnte einen positiven Blick hinter zu verwenden sein:

(?<=n)n

Es würde Ihnen die Endposition:

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

Wie von Timothy Khouri , eine positive Vorschau ist intuitiver

Ich würde auf seinen Vorschlag bevorzugen (?=nn)n die einfachere Form:

(n)(?=(n))

Das würde verweisen auf die erste Position der Saiten Sie wollen und würde die zweiten n in der Gruppe erfassen (2) .

Das ist so, weil:

  • Jeder gültiger regulärer Ausdruck kann in dem Look-Ahead verwendet werden.
  • Wenn es einfangende Klammern enthält, die Rückreferenzierungen wird gespeichert .

So Gruppe (1) und Gruppe (2) erfassen wird, was auch immer 'n' (auch wenn es sich um eine komplizierte Regex ist).

Andere Tipps

einen Look-Ahead mit einer Erfassungsgruppe Verwendung arbeitet, auf Kosten der Herstellung Ihres regex langsamer und komplizierter. Eine alternative Lösung ist die Regex.Match () -Methode zu sagen, wo das nächste Spiel Versuch beginnen soll. Versuchen Sie folgendes:

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

AFAIK gibt es keine reine regex Art und Weise, auf einmal zu tun (dh. Rücksendung der drei Aufnahmen Sie ohne Schleife Anfrage).

Jetzt können Sie ein Muster einmal, und Schleife auf der Suche mit Offset (gefundene Position + 1), ausgehend finden. Sollte kombinieren regex Verwendung mit einfachen Code.

[EDIT] Großartig, ich bin downvoted als ich sagte, im Grunde, was Jan gezeigt ...
[EDIT 2] Um klar zu sein: Jan Antwort besser ist. Nicht genauer, aber sicherlich detailliertere, die es verdient zu wählen. Ich verstehe einfach nicht, warum mein downvoted ist, da ich noch nichts falsch darin sehen. Keine große Sache, nur ärgerlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top