我正在尝试使用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,我仍在摸不着头脑。
答案 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}))$