2011-07-29 28 views

Respuesta

11

para que coincida mismos dígitos consecutivos:

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

Tenga en cuenta que tiene que escapar de la barra invertida cuando lo pone en un literal de cadena Java, por ejemplo "^([0-9])\\1*$".

Para la segunda, debe hacer explícitamente una lista de dígitos consecutivos utilizando el operador |. La expresión regular sería realmente larga y desagradable con hasta 10 parantheses anidados. Uno tiene que generar esta expresión regular usando un programa. En otras palabras, este es un problema incorrecto para resolver usando expresiones regulares. Sería mucho más simple escribir un ciclo y probar esto.

+0

Sí, tienes razón. Resolver con RegEx es realmente desagradable. Lo resolví con un buen viejo amigo para bucle. Gracias por la ayuda. – yyy

+0

@SusamPal, (4 años después ...) genial (+1)! por favor mira mi respuesta para el segundo. – JJoao

1

Este patrón coincidirá si el usuario entra en el mismo dígito:

^(\d)\1*$ 

\1 coincide con el primer grupo de captura, por lo que el patrón concuerda si ese primer dígito se repite para toda la cadena.

El segundo problema (dígitos consecutivos) es algo más difícil.

^(?:^(?:^(?:^(?:^0?1)?2)?3)4?)?5(?:$|6(?:$|7(?:$|8(?:$|90?))))$| 
    ^(0?1)?2(?:$|3(?:$|4))|^(6?7)?8(?:$|90?)$ 

es una implementación, asumiendo tres o más dígitos. Sin embargo, dado que el número de combinaciones es pequeña, enumerando (4 + dígitos) también es posible:

^(?:0?123(45?)?|1?23456?|2?34567?|3?45678?|4?56789?|(5?6)?7890?| 
     (0?1)?2345678?(90$)?|1?23456789?|2?345678(90?)?)$ 

dicho todo esto, las expresiones regulares no siempre funcionan bien para este tipo de problema. Un método Java para verificar esta secuencia podría ser más limpio.

+0

La segunda expresión regular no coincide con cadenas como "123", "345", etc. Edición: De acuerdo, ahora veo que ha asumido "6 dígitos". –

+0

gracias Susam, vi que 6 dígitos no eran un requisito y edité la publicación para hacerlo más general. – drf

+0

que resuelve si el número comienza con 0 o 1, creo. Para loop fue muy útil. Gracias por cierto. – yyy

0

Esta vez en Perl, para explicar el segundo caso más sencillo:

perl -nlE 'say "BAD number" if ($_ =~ /^(\d)\1*$/ or "123456789" =~ /$_/)' 

Explicación:

  • caso 1: Entrada ∈ /(\d)\1*/ idioma: ya presentados ($_ =~ /^(\d)\1*$/)
  • el caso 2: cadena "123456789" coincide con la entrada ("123456789" =~ /$_/)
Cuestiones relacionadas