web-dev-qa-db-ja.com

正規表現OR演算子を使用して2つの条件を解決する

OR演算子を使用して、2つの正規表現を1つに結合しようとしています:|

文字とそれに続く8桁の一致をチェックするものがあります。

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


私は別の9桁をチェックするものを持っています:

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


今、代わりに:

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


私は単にできると思った:

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


どうやら私はこの2つを正しく組み合わせていないようで、明らかに正規表現が恐ろしいです。どんな助けでも大歓迎です。

そして、不思議に思う人のために、 正規表現で2つの条件などを組み合わせる方法 を一目見ましたが、まだ頭を悩ませています。

25
Code Maverick

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

30
Mike C

|演算子は優先順位が高く、元の正規表現では最初に適用されます。優先順位を明確にするために、2つの正規表現とグループ化括弧を組み合わせる必要があります。次のように:

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

条件をグループ化すると思います。

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

^と$は行の始まりと終わりを表すため、or条件でそれらを考慮しないようにします。かっこを使用すると、「このかっこ内のすべて」または「この他のかっこ内のすべて」について明示できます。

11
Chris Shain

@MikeCの提供は最高のようです:

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

...しかし、なぜあなたの表現が期待通りに機能しないのかについては、| "or"または "alternation"演算子は非常に高い優先順位を持ちます-唯一上位の演算子はグループ化構造です。あなたの例を使用する場合:

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

...基本的には「文字列の先頭に一致、大文字、次に8桁OR 9桁、文字列の末尾に一致)」と言います-代わりに「文字列の先頭に一致」 、その後に大文字の後に8桁、次に文字列の終わりOR文字列の始まりに続いて9桁、次に文字列の終わり ")、次のいずれかが必要です。

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

これがあなたの理解に役立つことを願っています

9
Code Jockey

OR演算子も時々奇妙に感じます。グループを使用して、一致させるセクションを示すので、正規表現は次のようになります。^(([A-Z]\d{8})|(\d{9}))$

5
npinti