Perl Regex passende optionale Phrase im längeren Satz

Ich versuche, eine optionale (möglicherweise vorhandene) Phrase in einem Satz zu finden:

perl -e '$_="word1 word2 word3"; print "1:$1 2:$2 3:$3\n" if m/(word1).*(word2)?.*(word3)/'

Ausgabe

1:word1 2: 3:word3

Ich weiß, dass das erste '. *' Gierig ist und alles mit 'word3' übereinstimmt. Es nicht gierig zu machen, hilft nicht:

perl -e '$_="word1 word2 word3"; print "1:$1 2:$2 3:$3\n" if m/(word1).*?(word2)?.*(word3)/'

Ausgabe

1:word1 2: 3:word3 

Es scheint hier einen Interessenkonflikt zu geben. Ich hätte gedacht, Perl würde passen (word2)? wenn möglich und trotzdem sättigen die nicht gierigen. *?. Zumindest ist das mein Verständnis von "?". Auf der regulären Perl-Seite steht "?" macht 1 oder null mal so sollte es nicht lieber eine Übereinstimmung als null?

Sogar verwirrender ist es, wenn ich die. *?:

perl -e '$_="word1 word2 word3"; print "1:$1 2:$2 3:$3 4:$4\n" if m/(word1)(.*?)(word2)?.*(word3)/'

Ausgabe

1:word1 2: 3: 4:word3

Alle Gruppen hier erfassen Gruppen, daher weiß ich nicht, warum sie leer sind.

Nur um sicherzustellen, dass der Zwischen-Wort-Raum nicht erfasst wird:

perl -e '$_="word1_word2_word3"; print "1:$1 2:$2 3:$3 4:$4\n" if m/(word1)(.*?)(word2)?.*(word3)/'

Ausgabe

1:word1 2: 3: 4:word3

Gegeben, die einzige Übereinstimmung, die nicht erfasst wird, ist die zwischen Wort2 und Wort3. Ich kann nur davon ausgehen, dass es diejenige ist, die den Abgleich vornimmt. Sicher genug:

perl -e '$_="word1_word2_word3"; print "1:$1 2:$2 3:$3 4:$4 5:$5\n" if m/(word1)(.*?)(word2)?(.*)(word3)/'

Ausgabe

1:word1 2: 3: 4:_word2_ 5:word3

So funktioniert der gierige Abgleich rückwärts und Perl ist froh, keine (statt einer) Instanz von word2 abzugleichen. Es nicht gierig zu machen, hilft auch nicht.

Also meine Frage ist: Wie kann ich meine Regex schreiben, um eine mögliche Phrase in einem Satz abzugleichen und zu erfassen? Meine hier gegebenen Beispiele sind einfach; Der eigentliche Satz, den ich analysiere, ist viel länger und enthält viele Wörter zwischen den von mir übereinstimmenden Wörtern. Daher kann ich keine Länge oder Zusammensetzung des dazwischenliegenden Texts annehmen.

ielen Dank, Sco

Antworten auf die Frage(6)

Ihre Antwort auf die Frage