2010-03-30 15 views
8

devo una stringa di input che è un indirizzo di directory:Regular Expression più lunga possibile corrispondenza

Esempio: ProgramFiles/Micro/Telephone

e voglio abbinare contro una lista di parole molto strettamente:

Esempio: Tel|Tele|Telephone

Voglio corrispondere a Telephone e non a Tel. In questo momento il mio regex assomiglia a questo:

my($output) = ($input =~ m/($list)/o); 

L'espressione regolare sopra corrisponderà contro Tel. Cosa posso fare per risolverlo?

+0

Inserisci la tua partita preferita prima? – eyelidlessness

+0

In quale lingua stai lavorando? – EsotericNonsense

+0

piazzare una partita preferita primo non è sempre possibile - per esempio, sto attualmente la generazione di un elenco di possibili parole chiave per abbinare il concetto di "Numero Flat"; i miei dati sono multi-lingua e disordinati. Potrei vedere "Flt" o "Appartamento" o "Apt", o "Appartamento", o "Apartamento No" ... L'elenco potrebbe continuare! Cercando di costruire e mantenere un'espressione regolare che sta per corrispondere su tutti questi concetti, dove tutto è esattamente il giusto ordine è quasi praticamente impossibile. – Nick

risposta

9

Se si desidera una parola intera partita:

\b(Tel|Tele|Telephone)\b 

\b è un limite di parola di ampiezza zero. Il limite della parola in questo caso indica la transizione da o verso un carattere di parola. Un carattere word (\w) è [0-9a-zA-Z_].

Se si desidera semplicemente confrontare il più lungo in una parola parziale, mettere il primo più lungo. Ad esempio:

\b(Telephone|Tele|Tel) 

o

(Telephone|Tele|Tel) 
+1

La mia lista non può essere garantito per avere la parola più lunga prima. – syker

+0

La parola limite funziona. Ma non posso seguire il ragionamento sul motivo per cui ha funzionato. – syker

+0

@syker se vuoi corrispondenze parziali, il modo più semplice per costruire l'espressione è ordinare l'elenco di parole, invertire l'ordine e poi unire tutte le parole con '|' in mezzo e ciò ti darà l'ordine corretto di parole grandi con corrispondenze di parole più piccole. – cletus

2

Modificare gli ordini: Tel|Tele|Telephone a Telephone|Tele|Tel. Tramite l'algoritmo regexp, l'alternanza viene cercata da sinistra a destra, se è stata trovata una corrispondenza, questo è tutto, nessuna corrispondenza avida. Ad esempio:/a | ab | abc/lavorando su "abc" corrisponde a "a" invece del più avido "abc".

oppure utilizzare le espressioni corrispondenti.

Tel(?:e(?:phone)?)? 
+0

quanto è sicuro fare affidamento su questo comportamento? È nelle specifiche regex o qualcosa da qualche parte? Sarebbe davvero bello per me poter contare sul modulo '(XXX | XX | X)' per quello che sto implementando – Hashbrown

-1

ne dite di provare a trovare una corrispondenza, fino a quando la corrispondenza più lunga non è in qualsiasi parte del input? Qualcosa del tipo:

Trova telefono, O trova tel, e tele dove il telefono non è da nessuna parte nell'input. Quindi, per iniziare a fare apparire come una regex:.

(telefono) OR caratteri senza telefono, seguito da (tel | tele) seguito da caratteri senza telefono

(telefonici | * (telefono) {0 .} *. (tel | tele) * (telefono) {0} *)

fa che ha alcun senso.?

Problemi correlati