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.
Que diriez-vous d'utiliser ^[A-Z0-9]\d{8}$
?
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}))$"
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"
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
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}))$