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 个条件和更多条件,但我仍然摸不着头脑。

4

5 回答 5

51

|运算符具有高优先级,并且在您的原始正则表达式中将首先应用。您应该将两个正则表达式与分组括号结合起来,以明确优先级。如:

"^(([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}$

...但是至于为什么您的表达式没有按照您期望的方式工作,您必须了解|“或”或“交替”运算符具有非常高的优先级 - 我相信唯一更高的优先级是分组构造。如果您使用您的示例:

^[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 回答