2010-02-02 43 views
5

Necesito un patrón de expresiones regulares para que coincida con una secuencia de 3 dígitos consecutivos en una cadena que aumentan o disminuyen consecutivamente.¿Qué es un patrón Regex para 3 dígitos consecutivos que aumenta o disminuye?

Por ejemplo:

Estas cadenas deben coincidir (xxx123xxx, 789xxxxxx, xxxxxx987, xxxxxx432)

Estas cadenas no deben coincidir (xxxxxx454, 333xxxxxx, xxx429xxx)

+1

¿Por qué el requisito de una expresión regular? (No creo que esto se pueda hacer con la mayoría de los dialectos de expresiones regulares, las cláusulas condicionales de Perl podrían hacerlo). Es mejor hacer coincidir tres dígitos consecutivos y luego filtrar la relación entre ellos. – Richard

+3

"aumentar o disminuir" hace que las expresiones regulares no sean apropiadas para esta tarea –

+0

Este es un problema que requiere "estado" en cada punto. Considere usar una máquina de estado (analizador) para este problema. – stusmith

Respuesta

8

no hay otra manera de listándolos:

(012|123|234|345|456|567|678|789|987|876|765|654|543|432|321|210) 
+1

Esta es técnicamente la respuesta correcta, pero estoy de acuerdo en que Regex no es necesariamente la mejor manera de realizar la tarea. Se debe usar Regex para encontrar el patrón de 3 dígitos y luego se deben usar pruebas adicionales para encontrar si ese patrón de 3 dígitos es consecutivamente creciente/decreciente. – user106776

+0

@ matt.kovacs: Esa es una gran conclusión. – Gumbo

2

Esta va a ser una expresión regular muy complicada. En un proyecto en el que tuve que hacer algo muy similar, terminé haciendo coincidir los grupos de dígitos y pasando la validación real de los dígitos a un delegado (estaba haciendo esto en código C++, hice algo similar en otro proyecto en Java en de la misma manera).

Si es posible, esto es lo que recomendaría hacer aquí. Una expresión regular que podría hacer esto por sí misma sería muy difícil de leer o mantener.

3

Esto puede hacerse simplemente, pero sólo con la definición de los conjuntos de dígitos válidos consecutivos

(?: 012 | 210 | 123 | 321 | 234 | 432 | 345 | 543 | 456 | 654 | 567 | 765 | 678 | 876 | 789 | 987)

Cuestiones relacionadas