Regulärer Ausdruck, der alle Möglichkeiten auflistet

7

Wie kann ich bei einem regulären Ausdruck alle möglichen Treffer auflisten? Zum Beispiel: AB [CD] 1234, ich möchte, dass eine Liste wie folgt zurückgegeben wird: ABC1234 ABD1234

Ich habe das Internet durchsucht, konnte aber nichts finden.

    
gmuller 03.11.2009, 14:08
quelle

9 Antworten

8

Der Grund, warum Sie nichts gefunden haben, liegt wahrscheinlich daran, dass dies ein Problem von großer Komplexität ist, wenn man bedenkt, wie viele Kombinationen bestimmte Ausdrücke erlauben würden. Einige reguläre Ausdrücke könnten sogar infite Matches erlauben:

Betrachten Sie folgende Ausdrücke:

%Vor%

Ich denke, Ihre beste Wette wäre, einen Algorithmus basierend auf einer kleinen Teilmenge erlaubter Muster selbst zu erstellen. In Ihrem speziellen Fall würde ich vorschlagen, einen naiven Ansatz als einen regulären Ausdruck zu verwenden.

    
Yannick Motton 03.11.2009, 14:15
quelle
3

Für einige einfache reguläre Ausdrücke wie den von Ihnen angegebenen (AB [CD] 1234) gibt es eine begrenzte Menge an Übereinstimmungen. Aber für andere Ausdrücke (AB [CD] * 1234) ist die Anzahl der möglichen Übereinstimmungen nicht begrenzt.

Eine Methode zum Auffinden aller Möglichkeiten besteht darin, zu erkennen, wo im regulären Ausdruck Auswahlmöglichkeiten sind. Erstellen Sie für jede mögliche Auswahl einen neuen regulären Ausdruck basierend auf dem ursprünglichen regulären Ausdruck und der aktuellen Auswahl. Dieser neue reguläre Ausdruck ist jetzt ein wenig einfacher als der ursprüngliche.

Für einen Ausdruck wie "A [BC] [DE] F" wird die Methode wie folgt vorgehen

%Vor%     
midtiby 03.11.2009 14:19
quelle
2

Ein regulärer Ausdruck soll nur dazu dienen, einem Muster zu entsprechen. Der reguläre Ausdruck wird niemals etwas "auflisten", sondern nur zusammenpassen. Wenn Sie eine Liste aller Übereinstimmungen erhalten möchten, müssen Sie dies auf eigene Faust tun.

    
Scott Lance 03.11.2009 14:13
quelle
2

Unmöglich.

Wirklich.

Betrachten Sie vorausschauende Aussagen. Und was ist mit .* , wie werden Sie alle möglichen Zeichenfolgen erzeugen, die mit dieser Regex übereinstimmen?

    
Bart Kiers 03.11.2009 14:12
quelle
2

Es ist möglich, einen Algorithmus dafür zu schreiben, aber er funktioniert nur für reguläre Ausdrücke, die eine endliche Menge möglicher Übereinstimmungen haben. Ihre Regexes wären beschränkt auf:

  • Optional:?
  • Zeichen:. \ d \ D
  • Sets: wie [1a-c]
  • Negierte Sätze: [^ 2-9d-z]
  • Wechsel: |
  • Positive Lookarounds

So konnten Ihre Regex NICHT verwenden:

  • Repeater: * +
  • Wortmuster: \ w \ W
  • Negative Lookarounds
  • Einige Zusicherungen mit der Breite null: ^ $

Und es gibt noch einige andere (Wortgrenzen, faule und gierige Quantifizierer). Ich bin mir noch nicht sicher.

Wie für den Algorithmus selbst hat ein anderer Benutzer einen Link zu diese Antwort , die beschreibt, wie man sie erstellt.

    
Keith 07.05.2011 20:40
quelle
2

Exrex kann dies tun:

%Vor%     
Sjoerd 06.04.2017 13:42
quelle
1

Es kann möglich sein, einen Code zu finden, um alle möglichen Übereinstimmungen für etwas so einfaches aufzulisten, wie Sie gerade tun. Aber bei den meisten regulären Ausdrücken möchten Sie nicht einmal versuchen, alle möglichen Übereinstimmungen aufzulisten.

Zum Beispiel AB. * 1234 wäre AB gefolgt von absolut allem und dann 1234.

    
Kenny Drobnack 03.11.2009 14:13
quelle
0

Ich bin mir nicht ganz sicher, ob das überhaupt möglich ist, aber wenn es so wäre, wäre es in vielen Situationen so CPU- / zeitintensiv, dass es nicht sinnvoll wäre.

Versuchen Sie zum Beispiel, eine Liste aller Übereinstimmungen für A * Z

zu erstellen

Es gibt Seiten, die beim Erstellen eines guten regulären Ausdrucks helfen:

chills42 03.11.2009 14:13
quelle
0

Nun, Sie könnten den regulären Ausdruck in eine äquivalente endliche Zustandsmaschine umwandeln (ist relativ einfach und kann algorithmisch durchgeführt werden) und dann rekursiv jedem möglichen Pfad durch diese fsm folgen und die folgenden Pfade durch die Maschine ausgeben. Es ist weder sehr hart noch computerintensiv pro Ausgabe (Sie erhalten normalerweise eine riesige Menge an Output). Sie sollten jedoch darauf achten, potentielle unendliche Pässe zu verbieten (wie .* ). Dies kann durch eine maximal zulässige Pfadlänge erfolgen, nach der die Verfolgung abgebrochen wird

    
Grizzly 03.11.2009 14:19
quelle

Tags und Links