2 votes

RegEx : plage de numéros excluant un numéro spécifique

  • Utilisation de PHP

Je m'efforce de trouver une réponse à la question de savoir comment utiliser une expression rationnelle pour faire correspondre une série de chiffres, mais en excluant un chiffre.

c'est-à-dire que je recherche TOUTES les correspondances entre - AM19/0601 - AM19/0805 (mais PAS AM19/0803).

Je m'en sers pour voir si j'ai un match en cours :

AM19/6XX AM19/7XX AM19/8XX

/AM19\/0[678]

Comme dans :

if (preg_match('/AM19\/0[678]/', $perm) === 0) {
    //do whatever
}

Mais comment puis-je "exclure" l'option AM19/803 afin qu'elle ne soit pas incluse dans la correspondance/recherche ?

1voto

anubhava Points 172509

Vous pouvez utiliser une assertion lookahead négative dans votre regex :

~\bAM19/0(?!803)[678]\d{2}\b~

Démonstration de RegEx

Ici, nous avons un lookahead négatif (?!803) après l'appariement 19/0 qui échouera la correspondance si 803 apparaît juste après 19/0 en entrée.

Notez également qu'en utilisant un autre délimiteur de regex ~ vous pouvez éviter d'échapper / dans votre expression rationnelle.

1voto

Jan Points 370

Vous pourriez utiliser

\bAM19/(?!0803)\d+

Ou même

(?:AM19/0803)(*SKIP)(*FAIL)|AM19/\d+

Ce dernier point pourrait être un peu exagéré, voir une démo sur regex101.com .

1voto

Pedro Corso Points 482

Vous n'avez pas besoin d'un lookahead négatif ou de quoi que ce soit d'autre. Les crochets peuvent accepter des plages multiples (comme dans [a-zA-Z] par exemple). Vous pourriez simplement ignorer le numéro indésirable en utilisant des plages de plusieurs chiffres.

Solution : AM19\/0[6-8][0-9][0-24-9]

Regex101 : https://regex101.com/r/6Zc6br/3

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X