2012-08-29 9 views
8

Ich habe meine Regular Expression /'(.*)(?:(?:'\s*,\s*)|(?:'\)))/
und mein Testcode ('He said, "You're cool."' , 'Rawr')
(My Test-Code simuliert in eine Funktion Parameter übergeben werden.)

Ich werde meine Reguläre Ausdrücke erklären, wie ich es und hoffentlich ein paar von euch verstehen kann etwas Licht auf mein Problem werfen.

1) /' am Anfang des angepassten String bedeutet, es muss '

2) (.*) Mittel erfassen alle Zeichen außer \n 0 oder mehrmals

3) (?:(?:4)|(?:5)) Mittel erfassen nicht aber versuchen, tun Schritt 4 und wenn es nicht versuchen, Schritt 5

4) (?:'\s*,\s*) Mittel erfassen nicht funktioniert, aber es braucht eine ' mit 0 oder mehr Leerzeichen durch ein , mit 0 oder mehr Leerzeichen gefolgt sein

5) (?:'\)) Mittel erfassen nicht, aber es braucht ')

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

Wenn ich meinen Testcode ('He said, "You're cool."' , 'Rawr' (kein Ende Klammern) ändern sie es zurück, was ich will, aber sobald ich die letzte Klammer hinzu, so scheint es, dass mein OR-Operator tut, was es 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 auf eine Klammer gibt.

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

+0

Der Anfang der Zeichenfolge wäre '/ ^', nicht '/', fwiw. Persönlich bin ich nicht überzeugt, dass ich eine Regex für das verwenden würde, was Sie versuchen zu tun, sondern eher einen kleinen Parser. Verwirrende Regex ist verwirrend. –

+0

@DaveNewton - Ja, das weiß ich. Deshalb habe ich am Anfang der Matched-Saite gesagt. Vielleicht hätte ich am Anfang des übereinstimmenden Teils der Saite sagen sollen. Oder wenn es das Match startet, muss es mit einem '' 'beginnen. – Aust

Antwort

15

Ich glaube nicht, dass Ihr Problem der Operator OR ist, aber die greediness der .*. Es entspricht Ihrer vollständigen Zeichenfolge und dann zurück -track, bis die folgenden Ausdrücke übereinstimmen. Die erste Übereinstimmung in diesem Backtracking-Prozess wird 'He said, "You're cool."' , 'Rawr + ') sein. Versuchen Sie .*? stattdessen!

+1

Bergi du bist ein Genie! Das funktioniert perfekt. :) Macht es Ihnen etwas mehr darüber zu erklären, warum das funktioniert? Vergiss es, ich verstand von deinem Link. Danke noch einmal. :) – Aust

+0

Sie möchten vielleicht http://stackoverflow.com/a/5319978/1048572 lesen – Bergi

Verwandte Themen