2014-08-29 16 views
6

Esiste una soluzione elegante per creare un'espressione regolare a lunghezza variabile come questo?Look-behind a lunghezza variabile

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

Sembra Perl ha un impressionante motore regex e lookbehind lunghezza variabile sarebbe molto interessante. C'è un modo per farlo funzionare o devo dimenticare questa cattiva idea?

+0

vuoi abbinare solo "oggi" o "ieri" che arriva subito dopo "eat_apple" o "eat_pear" o "eat_orange" –

risposta

7

Utilizzare \K come caso speciale.

E 'una lunghezza variabile positiva lookbehind affermazione:

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

In alternativa, si possono elencare le vostre affermazioni lookbehind separatamente:

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

Tuttavia, vorrei proporre che sta andando ad essere un problema rara potrebbe potenzialmente utilizzare quella funzione, ma non potrebbe essere ripensata per utilizzare una combinazione di altre caratteristiche regex più comuni.

In altre parole, se rimani bloccato su un problema specifico, sentiti libero di condividerlo qui, e sono sicuro che qualcuno può trovare un approccio diverso (forse migliore).

+2

Nit: '\ K' non è un lookbehind a lunghezza variabile. Significa "mantenere" ed esclude ciò che lo precede dall'essere incluso in '$ &' (la stringa corrispondente). Detto questo, '\ K' può essere usato per emulare un lookbehind positivo a lunghezza variabile, quindi +1. –

3

È possibile utilizzare look-ahead, invece di look-dietro:

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

e, in generale, c'è un modo alternativo per descrivere le cose che sembrano ingenuamente a richiedere look-dietro.

3

ne dite:

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

Un po 'uggly, ma funziona.

+2

+1 questo è sicuramente un buon modo per aggirare un piccolo elenco limitato. – anubhava

+0

+1 E '(? <= Eat_apple_ | eat_pear_ | eat_orange _) (oggi | ieri)' (senza subpattern parentesi) non funzionerebbe in perl? Lunghezza fissa fissa: [vedi esempio] (http://regex101.com/r/sT2bH5/2) –

+1

@ Jonny5: No, non ci sono uguali in lunghezza. – Toto

Problemi correlati