2010-04-13 10 views
5

¿Es posible construir una expresión regular de estilo PCRE que solo concuerde con cada letra en una lista solo una vez?Regex para usar cada letra solo una vez?

Por ejemplo, si usted tiene las letras "LRSA" y se intenta que coincide con una lista de palabras en contra:

^[lrsa]*m[lrsa]*$ 

que va a coincidir "LAMS" (válido), sino también "lamas" (inválido para nuestros propósitos porque solo tenía una "a"). Si tu conjunto de letras era "lrsaa", querrías unir "lamas".

¿Esto es posible con expresiones regulares, o debería manejarlo programáticamente?

+0

Esto no va a funcionar como '[lrsaa]' 'es igual a [LRSA] '. – Gumbo

+1

Correcto, y ese es mi problema. Puede limitar con [lrsa] {4} pero eso aún coincidirá con "muchacha", por ejemplo. – gtcaz

+0

Lo que puede hacer es coincidir con los que quiere y algunos extras que no. Con una iteración de tus partidos, sería trivial filtrar los extras no deseados. – erisco

Respuesta

3

Puede usar negativo de preanálisis:

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

va a hacer lo que quiere

+1

Sí, eso funciona donde cada letra es única. Muy útil. (Necesito ordenarlo y ver cómo funciona. Leyendo esto también: http://stackoverflow.com/questions/1749437/regular-expression-negative-lookahead) ¿Qué pasa si hay más de una ocurrencia de una letra, por ejemplo: "abbcde" y quieres unir en "bebé" pero no "dade"? ¿Posible? – gtcaz

+0

No estoy seguro de que te haya entendido bien, pero tal vez esto haga el truco: '^ (?!. *? (D). *? \ 1) \ w + $' – ZyX

Cuestiones relacionadas