2017-06-23 4 views
-1

Je dois faire correspondre des nombres à 1, 2 ou 3 chiffres comme ([\d]|[\d][\d]|[\d][\d][\d]). Mais j'ai besoin d'une exception pour deux numéros spécifiques à 3 chiffres qui sont 350 et 380. Est-il possible de créer une seule regex pour atteindre mon objectif?Correspondance de la plupart des nombres de un à trois chiffres avec une expression régulière PCRE, mais pas tous

+1

Si c'était moi, je ne construirais pas l'exception dans la regex, j'obtiendrais juste la correspondance pour un nombre à 3 chiffres, et ensuite si '== 350 || 380' Je traiterais cela dans mon code. –

+0

Pourriez-vous s'il vous plaît expliquer ce que vous faites? Exemple de texte + sortie attendue? On dirait que vous avez besoin de '/^(?! 3 [58] 0 $) \ d {3} $ /' ou '/ \ b (?! 3 [58] 0 \ b) \ d {3} \ b $/' –

+0

Copie possible de [JS Regex pour exclure certains nombres] (https://stackoverflow.com/questions/33271845/js-regex-to-exclude-some-numbers) – DavidRR

Répondre

4

C'est assez facile:

  • 1 3 chiffres: \b\d{1,3}\b (limites de mots sont nécessaires ici - sinon vous pouvez correspondre partie d'un nombre plus)
  • Sauf 350 et 380: (?!350|380) ou (?!3[58]0) si vous comme des expressions moins lisibles;)

Combinez et vous obtiendrez:

\b(?!350|380)\d{1,3}\b 

Demo

+0

* si vous aimez les expressions moins lisibles * doit être lu comme * si vous aimez des expressions plus efficaces * –

+0

@ WiktorStribiżew si l'efficacité est ce que vous cherchez, alors écrivez «\ b \ d {1,3} \ b (?

+0

Je suis plus friand de motifs regex multiplateformes. –

0

Vous pouvez dire 1 à 3 du même caractère avec {MIN, MAX}. Cela simplifie votre regexp:

/^\d{1,3}$/ 

De plus, à moins que vous voulez faire correspondre 123 à partir de chaînes comme 12345 vous voulez ajouter des contraintes à l'avant et à l'arrière, peut-être pas un chiffre ou un espace, virgule, etc. Dans ce qui précède, les ^ et $ s'assurent que les chiffres sont tous seuls sur une ligne. Enfin, il est probablement plus facile de comparer le résultat final avec 350 et 380 plutôt que d'essayer de créer un RE complexe. Cela rendra le code final beaucoup plus facile à lire et à comprendre.