使用Regex OR运算符解决2个条件

Cod*_*ick 25 regex vb.net asp.net

我试图用OR运算符将2个正则表达式组合成1: |

我有一个检查字母后跟8位数的匹配:

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


我有另一个只检查9位数:

Regex.IsMatch(s, "^\d{9}$")
Run Code Online (Sandbox Code Playgroud)


现在,而不是做:

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


我以为我可以做到:

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


显然我没有正确地将两者结合起来,显然我对正则表达式很恐怖.任何帮助将非常感激.

对于那些想知道的人,我确实看了一眼如何在正则表达式中结合2个条件和更多条件,我仍然在摸不着头脑.

Mik*_*yan 48

|经营者具有较高的优先级,并在原来的正则表达式将得到首次应用.你应该将两个正则表达式的w /分组括号结合起来,使优先级清晰.如:

"^(([A-Z]\d{8})|(\d{9}))$"
Run Code Online (Sandbox Code Playgroud)


Mik*_*e C 30

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

  • 非常感谢.我无法相信我在修补过程中没有尝试过.当我开始思考它时,正则表达让我疲惫不堪,哈哈. (4认同)

Chr*_*ain 11

我想你想把条件分组:

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

^和$表示行的开头和结尾,因此您不希望在条件中考虑它们.parens允许你明确"在这个paren中的一切"或"在这个paren中的任何东西"


Cod*_*key 9

@ MikeC的产品似乎是最好的:

^[A-Z0-9]\d{8}$
Run Code Online (Sandbox Code Playgroud)

...但至于为什么你的表达式没有按你期望的方式工作,你必须明白|"或"或"交替"运算符具有非常高的优先级 - 我相信唯一更高的是分组结构.如果你使用你的例子:

^[A-Z]\d{8}|\d{9}$
Run Code Online (Sandbox Code Playgroud)

...你基本上是说"匹配字符串的开头,大写字母,然后8位数字或匹配9位数字然后字符串结束" - 如果,你的意思是"匹配字符串的开头,那么大写字母后跟8位数字然后是字符串的结尾或字符串的开头后跟9位,然后是字符串的结尾",那么你想要其中一个:

^([A-Z]\d{8}|\d{9})$
^[A-Z]\d{8}$|^\d{9}$
Run Code Online (Sandbox Code Playgroud)

希望这有助于您的理解


npi*_*nti 5

我发现OR操作员有时也有点奇怪,我做什么我用组来表示我想要匹配的部分,所以你的正则表达式会变成这样:^(([A-Z]\d{8})|(\d{9}))$