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

时间:2012-04-10 18:41:58

标签: asp.net regex vb.net

我正在尝试使用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


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

对于那些想知道的人,我确实瞥了一眼How to combine 2 conditions and more in regex,我仍在摸不着头脑。

5 个答案:

答案 0 :(得分:48)

|运算符具有较高的优先级,并且在原始正则表达式中将首先应用。你应该将两个正则表达式的w /分组括号结合起来,使优先级清晰。如:

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

答案 1 :(得分:30)

如何使用^[A-Z0-9]\d{8}$

答案 2 :(得分:11)

我认为你想对条件进行分组:

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

^和$代表该行的开头和结尾,因此您不希望在条件中考虑它们。 parens允许你明确"在这个paren"或者"其他任何内容中的任何内容"

答案 3 :(得分:9)

@ MikeC的提供似乎是最好的:

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

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

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

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

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

希望这有助于您的理解

答案 4 :(得分:5)

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