2013-07-22 4 views
0

J'ai besoin d'aide pour construire une expression régulière dans une application ColdFusion. Je m'excuse si cela a été demandé. J'ai cherché, mais je ne demande peut-être pas la bonne chose.Correspondance ColdFusion Regex pour les chiffres de longueur exacte

J'utilise ce qui suit pour rechercher une ligne d'objet e-mail pour un numéro d'émission:

reMatchNoCase("[0-9]{5}", mailCheck.subject) 

Le numéro d'émission ne contient que des valeurs numériques, et doit être exactement 5 chiffres. Cela fonctionne sauf dans les cas où j'ai un nombre plus long qui apparaît dans la chaîne, tel que 34512345. Il prend également les 5 premiers chiffres de cette chaîne comme numéro de problème valide.

Ce que je veux est de récupérer seulement 5 chiffres, rien de plus court ou plus long. Je place ensuite ceux-ci dans une liste à boucler et à traiter. Ai-je besoin d'inclure des espaces avant et après dans l'expression rationnelle pour obtenir le résultat souhaité?

Merci.

Répondre

6

La manière générale d'exclure du contenu avant/après une correspondance est d'utiliser un lookbehind négatif avant la correspondance et une vue négative ultérieure. Pour ce faire, pour les chiffres numériques serait:

(?<!\d)\d{5}(?!\d) 

(Où \d est le raccourci pour [0-9])

regex CF soutient lookaheads, mais malheureusement pas d'assertions arrières, de sorte que cela ne fonctionne pas directement dans le match retour - mais qui ne doute pas d'importance dans ce cas, car il est probable que vous ne voulez pas, par exemple, abc12345 pour correspondre soit - si ce que vous voulez plus probable est:

\b\d{5}\b 

\b est une "limite de mot" - à peu près, il vérifie un changement entre un "caractère de mot" et un caractère non-mot (ou vice versa) - dans ce cas, le premier \b vérifiera qu'il n'y a pas un [a-zA-Z0-9_] avant le premier chiffre, et le second \b vérifiera qu'il n'y en a pas un après le cinquième chiffre. Un \b n'ajoute aucun caractère à la correspondance (c'est-à-dire qu'il s'agit d'une assertion de largeur nulle).

Puisque vous n'êtes pas traiter les cas, vous n'avez pas besoin de la variable nocase et peut simplement écrire:

rematch('\b\d{5}\b' , mailCheck.subject) 

L'avantage de cette plus simple vérification des espaces est que le résultat est de cinq chiffres (pas besoin de couper), mais l'inconvénient est qu'il correspondrait à des valeurs telles que [12345] ou 3.14159^2 qui ne sont probablement pas ce que vous voulez?

Pour vérifier les espaces, ou le début/fin de la chaîne, vous pouvez le faire:

rematch('(?:^|)\d{5}(?= |$)' , mailCheck.subject) 

Ensuite, utilisez trim sur chaque résultat pour supprimer les espaces.

Si ce n'est pas ce que vous recherchez, allez-y et donnez plus de détails.

Questions connexes