2014-08-29 23 views
6

Gibt es eine elegante Lösung, um einen Look-Behind-Regex variabler Länge wie diesen zu erstellen?Lookback mit variabler Länge

Es scheint, Perl hat eine sehr beeindruckende Regex-Engine und variable Länge Lookbehind wäre sehr interessant. Gibt es eine Möglichkeit, es zum Laufen zu bringen oder sollte ich diese schlechte Idee vergessen?

+0

wolltest du nur 'today' oder' gestern' zusammenbringen, das kommt gleich nach 'essen_apple' oder' essen_pear' oder 'essen_orange' –

Antwort

7

Verwenden Sie \K als Sonderfall.

Es ist eine variable Länge positive Lookbehind Behauptung:

/eat_(?:apple|pear|orange)_\Ktoday|yesterday/g 

Alternativ können Sie Ihre Lookbehind Behauptungen getrennt auflisten:

/(?:(?<=eat_apple_)|(?<=eat_pear_)|(?<=eat_orange_))today|yesterday/g 

Allerdings würde ich vorschlagen, dass es ein seltenes Problem sein wird Das könnte diese Funktion möglicherweise nutzen, könnte aber nicht neu gedacht werden, um eine Kombination anderer häufigerer Regex-Funktionen zu verwenden.

Mit anderen Worten, wenn Sie an einem bestimmten Problem hängen bleiben, fühlen Sie sich frei, es hier zu teilen, und ich bin sicher, dass jemand mit einem anderen (vielleicht besseren) Ansatz kommen kann.

+2

Nit: '\ K' ist kein Lookback mit variabler Länge. Es bedeutet "behalten" und schließt alles aus, was davor steht, in '$ &' (die übereinstimmende Zeichenkette) eingeschlossen zu sein. Das heißt, "\ K" kann verwendet werden, um ein positives Lookbehind variabler Länge zu emulieren, also +1. –

3

Sie können Vorgriff statt Blick hinter verwenden:

/(?:eat_(apple|pear|orange)_)(?=today|yesterday)/g 

und in der Regel gibt es eine alternative Möglichkeit, die Dinge zu beschreiben, die naiv scheinen Blick hinter zu erfordern.

3

Wie wäre:

(?:(?<=eat_apple_)|(?<=eat_pear_)|(?<=eat_orange_))(today|yesterday) 

Ein wenig uggly, aber es funktioniert.

+2

+1 das ist definitiv eine gute Problemumgehung für eine kleine endliche Liste. – anubhava

+0

+1 Und '(? <= Eat_apple_ | eat_pear_ | eat_orange _) (heute | gestern)' (ohne eingeklammerte Untermuster) würde in Perl nicht funktionieren? Immer noch feste Länge: [siehe Beispiel] (http://regex101.com/r/sT2bH5/2) –

+1

@ Jonny5: Nein, die Länge ist nicht gleich. – Toto

Verwandte Themen