27

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つ以上の条件を組み合わせる方法を一瞥しましたが、まだ頭を悩ませています。

4

5 に答える 5

51

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

"^(([A-Z]\d{8})|(\d{9}))$"
于 2012-04-10T18:46:04.483 に答える
30

使って^[A-Z0-9]\d{8}$みませんか?

于 2012-04-10T18:45:51.590 に答える
12

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

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

^と$は行の最初と最後を表すため、or条件で考慮されないようにします。パレンを使用すると、「このパレンのすべて」または「この他のパレンのすべて」について明示することができます。

于 2012-04-10T18:45:20.917 に答える
9

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

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

...しかし、式が期待どおりに機能しない理由については、|「or」または「alternation」演算子の優先順位が非常に高いことを理解する必要があります。上位の演算子はグループ化構造だけだと思います。例を使用する場合:

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

...基本的には、「文字列の先頭、大文字、8桁に一致するか、9桁、文字列の末尾に一致する」という意味です。代わりに、「文字列の先頭に一致し、大文字の後に8桁が続く」という意味の場合次に、文字列の終わり、または文字列の始まりの後に9桁、次に文字列の終わり」のいずれかが必要です。

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

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

于 2012-04-10T19:00:22.773 に答える
5

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

于 2012-04-10T18:45:41.947 に答える