2011-12-22 13 views
7

Me preguntaba si se podrían agregar más comprobaciones: [Pregunta respondida previamente] ( Trying to build a regular expression to check pattern).Intentando crear una expresión regular para verificar el patrón - 2

El problema anterior se resuelve brillantemente el uso de esta expresión regular por Brian Rogers:

/^([1-9]|[12][0-9]|3[01])(-([1-9]|[12][0-9]|3[01]))?(,([1-9]|[12][0-9]|3[01])(-([1-9]|[12][0-9]|3[01]))?)*$/ 

[Para referencia, registrando el problema mayor de nuevo]

  1. empezar y terminar con un número
  2. El guión debe comenzar y terminar con un número
  3. La coma debe comenzar y terminar con un número
  4. El rango del número debe ser de 1-31
  5. Si un número comienza con un guión (-), no puede terminar con ningún otro carácter que no sea una coma Y siga todas las reglas enumeradas anteriormente.

E.g. 2-2,1 O 2,2-1 es válido, mientras que 1-1-1-1 no es válido.

Ej:
- 1-5,5,15-29
- 1,28,1-31,15
- 15,25,3 - 1-24,5-6,2- 9

¿Podría ir un paso más allá y agregar otras validaciones?

1) Los números deben estar en orden ascendente
Ej:
- 1,2-3 - Válido
- 4-6,23 - Válido
- 23,4-5 - Inválido

2) Los números no deben repetir
Ej:
a) 2,2,2 - Inválido
b) 2,3-6,3 - Inválido
c) 2,5,7-20 - Válido

3) Si es posible Número
no debe repetir si se ha definido anteriormente en la gama
Ej:
a) 2,3-6, 4 - no válida, porque 4 ya es un número entre 3 y 6
b) 12-16, 14-18 - Inválido, porque 14,15 y 16 ya están definidos en 12-16
c) 9-13, 15, 17-19 - Válido

+11

No, estás comenzando a hacer preguntas que dependen de la * interpretación * de las secuencias de caracteres particulares (por ejemplo, que 3-6 representa los números enteros 3, 4, 5 y 6). No puedes tratar con tales cosas en una expresión regular. –

+0

Puede ser que encuentre [esta pregunta] (http://stackoverflow.com/questions/3907019/how-to-reduce-lists-of-ranges) usefull [1]: http: // stackoverflow. com/questions/3907019/how-to-reduce-lists-of-ranges – Toto

+0

@ M42 - para enlaces en comentarios, ponga texto entre corchetes ('[]'), y luego la URL inmediatamente después entre corchetes ('() '), Ej. '[esta pregunta] (http: // en algún lugar)' –

Respuesta

1

Se supone que la expresión regular debe verificar un patrón y no para manejar la lógica de negocios. En el momento en que empiezas a plantear tu problema con "if ... then ... else", no es algo que se supone que debe manejar la expresión regular.

0

Las expresiones regulares son muy potentes y pueden ser utilizadas para resolver el tipo de desafío que tiene, incluso implementando algún tipo de validación de lógica de negocios.

Desde el punto de vista de la ingeniería arquitectónica y del software, le recomendaría que restructure el problema y utilice un código de programa para resolver el problema. Voy a explicar por qué: El código obtendrá

  • muy difícil de leer y entender el error
  • propensa y no es fácil de probar
  • el costo de mantenimiento que se disparará

En resumen, a pesar de que las expresiones regulares son muy poderosas (las utilizo mucho en mis aplicaciones) no me excedería. Son muy elegantes para resolver algunos problemas, pero se vuelven muy feos para resolver cosas simples.

Cuestiones relacionadas