RegExp - Wie kann ich den kürzesten möglichen Betrag erreichen?

9

Ich habe meinen regulären Ausdruck /'(.*)(?:(?:'\s*,\s*)|(?:'\)))/
und mein Testcode ('He said, "You're cool."' , 'Rawr')
(Mein Testcode simuliert Parameter, die an eine Funktion übergeben werden.)

Ich werde meinen Regulären Ausdruck so erklären, wie ich es verstehe, und hoffentlich können einige von euch etwas über mein Problem herausfinden.

1) /' bedeutet, dass am Anfang der übereinstimmenden Zeichenkette ' -
stehen muss 2) (.*) bedeutet, dass ein beliebiges Zeichen mit Ausnahme von \n 0 oder mehrmals erfasst wird.

3) (?:(?:4)|(?:5)) bedeutet nicht erfassen, aber versuchen Sie Schritt 4 und wenn es nicht funktioniert, versuchen Sie Schritt 5

4) (?:'\s*,\s*) bedeutet, nicht erfassen, aber es muss ein ' mit 0 oder mehr Leerzeichen, gefolgt von einem , mit 0 oder mehr Leerzeichen Zeichen sein 5) (?:'\)) bedeutet nicht erfassen, aber es muss ') sein

So scheint es, dass es das zurückgeben sollte (und das ist, was ich will):
' + He said, "You're cool." + ' ,
Aber es gibt zurück:
' + He said, "You're cool."' , 'Rawr + ')

Wenn ich meinen Testcode in ('He said, "You're cool."' , 'Rawr' (keine Endklammer) ändere, gibt er zurück, was ich will, aber sobald ich die letzte Klammer hinzufüge, scheint es, dass mein OR-Operator tut, was er will. Ich möchte, dass es zuerst prüft, ob es ein Komma gibt, und breche dort, wenn es ein Komma gibt, und wenn es keine Überprüfung für eine Klammer gibt.

Ich habe versucht, die Punkte von Schritt 4 und Schritt 5 zu wechseln, aber immer noch scheint der OR-Operator immer auf die Seite (?:'\)) zu setzen. Wie kann ich den kürzesten möglichen Betrag erreichen?

    
Aust 29.08.2012, 16:07
quelle

1 Antwort

15

Ich glaube nicht, dass Ihr Problem der OR-Operator ist, sondern die Gier von .* . Es wird Ihre vollständige Zeichenfolge und dann zurück -track entsprechen, bis die folgenden Ausdrücke übereinstimmen. Die erste Übereinstimmung in diesem Backtracking-Prozess ist 'He said, "You're cool."' , 'Rawr + ') . Probiere stattdessen .*? !

    
Bergi 29.08.2012, 16:16
quelle

Tags und Links