web-dev-qa-db-fra.com

Utilisation de Regex OR opérateur pour résoudre 2 conditions

J'essaie de combiner 2 expressions régulières en 1 avec l'opérateur OR: |

J'en ai un qui vérifie la correspondance d'une lettre suivie de 8 chiffres:

Regex.IsMatch(s, "^[A-Z]\d{8}$")


J'en ai un autre qui vérifie simplement 9 chiffres:

Regex.IsMatch(s, "^\d{9}$")


Maintenant, au lieu de faire:

If Not Regex.IsMatch(s, "^[A-Z]\d{8}$") AndAlso
   Not Regex.IsMatch(s, "^\d{9}$") Then 
    ...
End If


Je pensais que je pouvais simplement faire:

If Not Regex.IsMatch(s, "^[A-Z]\d{8}|\d{9}$") Then
    ...
End If


Apparemment, je ne combine pas les deux correctement et apparemment je suis horrible aux expressions régulières. Toute aide serait très appréciée.

Et pour ceux qui se demandent, j'ai jeté un coup d'œil à Comment combiner 2 conditions et plus en regex et je me gratte toujours la tête.

25
Code Maverick

Que diriez-vous d'utiliser ^[A-Z0-9]\d{8}$?

30
Mike C

Le | L'opérateur a une priorité élevée et dans votre regex d'origine sera appliqué en premier. Vous devez combiner les deux regex avec des parenthèses de regroupement pour clarifier la priorité. Un péché:

"^(([A-Z]\d{8})|(\d{9}))$"
48
Mike Ryan

Je pense que vous souhaitez regrouper les conditions:

Regex.IsMatch(s, "^(([A-Z]\d{8})|(\d{9}))$")

Les ^ et $ représentent le début et la fin de la ligne, vous ne voulez donc pas qu'ils soient pris en compte dans la condition or. Les parens vous permettent d'être explicite sur "tout dans cette paren" ou "quoi que ce soit dans cette autre paren"

11
Chris Shain

L'offre de MikeC semble la meilleure:

^[A-Z0-9]\d{8}$

... mais pour savoir pourquoi votre expression ne fonctionne pas comme vous vous en doutez, vous devez comprendre que le | "ou" ou "alternance" a une priorité très élevée - la seule plus élevée est la construction de groupement, je crois. Si vous utilisez votre exemple:

^[A-Z]\d{8}|\d{9}$

... vous dites essentiellement "correspond au début de la chaîne, en majuscule, puis à 8 chiffres OR correspond à 9 chiffres puis à la fin de la chaîne" - si, au contraire, vous voulez dire "correspond au début de la chaîne , puis une majuscule suivie de 8 chiffres puis la fin de la chaîne OR le début de la chaîne suivi de 9 chiffres, puis la fin de la chaîne ", alors vous voulez l'un d'eux:

^([A-Z]\d{8}|\d{9})$
^[A-Z]\d{8}$|^\d{9}$

J'espère que cela vous sera utile pour votre compréhension

9
Code Jockey

Je trouve que l'opérateur OR est parfois un peu bizarre aussi, ce que je fais J'utilise des groupes pour indiquer les sections que je veux faire correspondre, donc votre expression régulière deviendrait quelque chose comme ça: ^(([A-Z]\d{8})|(\d{9}))$

5
npinti