2010-04-13 29 views
5

È possibile creare un'espressione regolare in stile PCRE che abbinerà solo una lettera in una lista solo una volta?Regex per utilizzare ogni lettera una sola volta?

Ad esempio, se si hanno le lettere "lrsa" e si tenta che corrispondono a un elenco di parole contro:

^[lrsa]*m[lrsa]*$ 

si sta andando per corrispondenza "LAMS" (valido), ma anche "lama" (non valido per i nostri scopi perché hai avuto solo una "a"). Se il set di lettere era "lrsaa", dovresti abbinare "lamas".

Ciò è possibile con le espressioni regolari o devo gestirlo a livello di codice?

+0

Questo non funzionerà come '[lrsaa]' 'è uguale a [lrsa]'. – Gumbo

+1

Giusto, ed è il mio problema. Puoi limitare con [lrsa] {4} ma ad ogni modo corrisponderà ancora "lass". – gtcaz

+0

Quello che puoi fare è abbinare sia quelli che vuoi sia alcuni extra che non hai. Con un'iterazione delle partite, sarebbe banale filtrare gli extra indesiderati. – erisco

risposta

3

È possibile utilizzare negativo look-ahead:

^(?!.*?(.).*?\1)[lrsa]*m[lrsa]*$ 

farà quello che vuoi

+1

Sì, funziona dove ogni lettera è unica. Molto utile. (Ho bisogno di risolverlo e di capire come funziona. Leggendo anche questo: http://stackoverflow.com/questions/1749437/regular-expression-negative-lookahead) E dove ci sono più di una occorrenza di una lettera, ad es .: "abbcde" e vuoi abbinare "babe" ma non "dade"? Possibile? – gtcaz

+0

Non sono sicuro di aver capito bene, ma forse questo farà il trucco: '^ (?!. *? (D). *? \ 1) \ w + $' – ZyX

Problemi correlati