2011-05-27 23 views
7

Necesito poder hacer coincidir una serie de números (cualquier número entre 1 y 9), con tantos dígitos diferentes como el usuario ingrese pero no repetición.Use regex para que coincida con una serie de números del 1 al 9, sin repetición

123456789 -> partido
1223 -> ninguna coincidencia

En efecto, el número debe estar entre 1 y 9 dígitos de longitud, que contiene sólo números, y no repetir cualquier dígito.

¿Cómo haré esto usando regex?

+2

¿Los números están necesariamente ordenados? – Vache

+0

No, no hay orden. –

Respuesta

3

Algo parecido a continuación debería funcionar:

(?!.*([1-9]).*\1)^[1-9]{1,9}$ 

(?!.*([1-9]).*\1) - aspecto negativo de la comprobación por delante si los dígitos no se repiten.

partidos de la muestra: http://regexr.com?2trr6

+0

No consigo que coincida con mis números de muestra: '12351874'. ¿Puedes? EDITAR: a menos que no quieran que el número que se utilizó anteriormente aparezca en cualquier lugar dentro de la cadena ... –

+0

Eso no debería coincidir - se repite el dígito "1". Esta solución dice correctamente que esto no coincide. – Tadmas

+0

@Brad Christie - lo siento, no entendiendo realmente su pregunta aquí – manojlds

0
^(?:([1-9])(?!\1))+$ 

Es decir, un dígito, seguido de algo que no es el mismo dígito, al menos una vez.

Lo siento, una pregunta malinterpretada. Pensé que querías decir que debería fallar si el mismo número se usa dos veces seguidas. Si desea que no hay repeticiones para la toda secuencia de dígitos, utilice:

^(?:([1-9])(?!.*\1))+$ 
+0

La pregunta no es muy clara, pero espero que cada dígito solo se permita una vez, p. '123123' no sería una coincidencia. –

+0

No funciona con "121". Regex.IsMatch devuelve verdadero. – Tadmas

+0

No funciona - http://regexr.com?2trqq – manojlds

1

honestamente yo uso más php que C#, pero esto debería funcionar

^(?:([1-9])(?![1-9]*?\1))*$ 
0

Aquí es una solución diferente. Así es como lo habría hecho. No soy un gran admirador de lookaheads/lookbehinds a menos que hagan realmente más fácil el código.

string numbers = "123456789"; 
string example = "12345 1123456 19283741 987654321"; 

var matches = Regex.Matches(example, @"\d+"); 
for (int i = 0; i < matches.Count; i++) { 
    var match = matches[i].Value; 
    if (!numbers.Any(number => match.Count(x => x == number) >= 2)) { 
     Console.WriteLine(match); 
    } 
} 

Si lo ejecuta, verá que se imprime:

12345 
987654321 

Creo que es bastante sencillo de lo que estoy haciendo aquí.

Estoy extrayendo todos los números del texto, sin importar si tiene dígitos repetidos o no, y luego, para cada número (1 - 9), solo tomará aquellas coincidencias que no contengan más de una repetición.

Cuestiones relacionadas