2010-02-02 4 views
5

J'ai besoin d'un motif regex pour correspondre à une séquence de 3 chiffres consécutifs dans une chaîne qui augmentent ou diminuent consécutivement.Qu'est-ce qu'un motif Regex pour 3 chiffres consécutifs croissant ou décroissant

Par exemple:

Ces chaînes doivent correspondre (xxx123xxx, 789xxxxxx, xxxxxx987, xxxxxx432)

Ces chaînes ne doivent pas correspondre (xxxxxx454, 333xxxxxx, xxx429xxx)

+1

Pourquoi l'exigence d'une regex? (Je ne pense pas que cela puisse être fait avec la plupart des dialectes regex, les clauses conditionnelles de Perl pourraient le faire). Mieux vaut faire correspondre trois chiffres consécutifs, puis filtrer pour la relation entre eux. – Richard

+3

"croissant ou décroissant" rend les expressions rationnelles inappropriées pour cette tâche –

+0

Il s'agit d'un problème qui nécessite un "état" à chaque point. Envisagez d'utiliser une machine d'état (analyseur) pour ce problème. – stusmith

Répondre

8

Il n'y a pas d'autre moyen que les énumérer:

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

C'est techniquement la bonne réponse, mais je suis d'accord que Regex n'est pas nécessairement la meilleure façon d'accomplir la tâche. Regex devrait être utilisé pour trouver le modèle à 3 chiffres, puis d'autres tests devraient être utilisés pour déterminer si ce modèle à 3 chiffres augmente ou diminue consécutivement. – user106776

+0

@ matt.kovacs: C'est une bonne conclusion. – Gumbo

2

Cela va être une regex très compliquée. Sur un projet où je devais faire quelque chose de très similaire, j'ai fini par faire correspondre les groupes de chiffres puis passer la validation réelle des chiffres à un délégué (je faisais ça en code C++, j'ai fait quelque chose de similaire sur un autre projet en Java). de la même façon).

Si possible, c'est ce que je recommande de faire ici. Un regex qui pourrait le faire tout seul serait très difficile à lire ou à maintenir.

3

Cela peut être fait simplement, mais seulement avec la définition des ensembles valides de chiffres consécutifs

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

Questions connexes