2012-10-13 44 views

Respuesta

38

Prueba de esto, que podría funcionar,

^(?:([A-Za-z])(?!.*\1))*$ 

Explicación

Assert position at the beginning of a line (at beginning of the string or after a line break character) «^» 
Match the regular expression below «(?:([A-Z])(?!.*\1))*» 
    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
    Match the regular expression below and capture its match into backreference number 1 «([A-Z])» 
     Match a single character in the range between “A” and “Z” «[A-Z]» 
    Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?!.*\1)» 
     Match any single character that is not a line break character «.*» 
     Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
     Match the same text as most recently matched by capturing group number 1 «\1» 
Assert position at the end of a line (at the end of the string or before a line break character) «$» 
+0

Perfecto, gracias! – alfasin

+2

@JohnWoo Me pregunto qué herramienta usaste para generar la explicación? – turtledove

+0

@JohnWoo ¡Gracias, gran herramienta! – turtledove

11

Puede comprobar si existen 2 instancias del carácter en la cadena:

^.*(.).*\1.*$ 

(simplemente capturo uno de los caracteres y verifico si tiene una copia en otro lado con referencia. El resto de .* no son importantes).

Si la expresión regular anterior coincide, entonces la cadena tiene carácter repetitivo. Si la expresión regular anterior no coincide, entonces todos los caracteres son únicos.

Lo bueno de la expresión regular anterior es cuando el motor de expresiones regulares no admite mirar alrededor.

Al parecer, la solución de John Woo es una hermosa manera de verificar la singularidad directamente. Afirma en cada carácter que la secuencia a continuación no contendrá el carácter actual.

+1

Simple y efectivo. Incluso más simple de ver sin los anclajes: '(.). * \ 1' – pabo

0

Ésta también proporcionaría un partido lleno a cualquier longitud de palabra con letras que no se repiten:

^(?!.*(.).*\1)[a-z]+$ 

Revisé ligeramente el answer proporcionado por @Bohemian a otra pregunta hace un tiempo para obtener th es.

También ha pasado un tiempo desde que se hizo la pregunta anterior, pero pensé que sería bueno tener también este patrón de expresiones regulares aquí.

Cuestiones relacionadas