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つの条件などを組み合わせる方法 を一目見ましたが、まだ頭を悩ませています。
^[A-Z0-9]\d{8}$
?
|
演算子は優先順位が高く、元の正規表現では最初に適用されます。優先順位を明確にするために、2つの正規表現とグループ化括弧を組み合わせる必要があります。次のように:
"^(([A-Z]\d{8})|(\d{9}))$"
条件をグループ化すると思います。
Regex.IsMatch(s, "^(([A-Z]\d{8})|(\d{9}))$")
^と$は行の始まりと終わりを表すため、or条件でそれらを考慮しないようにします。かっこを使用すると、「このかっこ内のすべて」または「この他のかっこ内のすべて」について明示できます。
@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}$
これがあなたの理解に役立つことを願っています
OR
演算子も時々奇妙に感じます。グループを使用して、一致させるセクションを示すので、正規表現は次のようになります。^(([A-Z]\d{8})|(\d{9}))$