【问题标题】:Using Regex OR operator to solve 2 conditions使用 Regex OR 运算符解决 2 个条件
【发布时间】:2012-04-23 02:02:11
【问题描述】:

我正在尝试使用 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,但我仍在摸不着头脑。

【问题讨论】:

  • 另一种写法是"^[A-Z0-9]\d{8}$"(大写字母或数字后跟8个数字)。不过,我认为您的正则表达式没有问题。你能提供一些应该/不应该匹配的字符串示例吗?
  • @PatrickMcElhaney 有效条目为:A1234578 或 123456789
  • @Scott Patrick 的建议支持这两者,下面 Mike C 的回答也支持相同的正则表达式。
  • Scott - 通常情况下,如果我看到有人用相同的答案击败了我,我会删除我的帖子 - 但是,我看到的时间表明我领先一分钟。选择是你的,寿 :-)
  • 如果您觉得它有用,我提供了一个可能的解释,说明为什么您的表达可能不像您期望的那样工作,但我不能确定,因为没有关于如何你的表达失败了:)

标签: asp.net regex vb.net


【解决方案1】:

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

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

【讨论】:

  • 只是好奇你的语句的语义:你不把分组括号算作“运算符”吗?如果不是,它们是什么? “构造”?
  • 嗯,是的,你是对的——我的语言不够精确。向人们解释它是一种习惯——他们自然接受分组括号覆盖优先顺序,然后再考虑所有其他运算符。但最好准确一点,所以我会澄清一下。
  • @CodeJockey 我考虑写更多,但你的回答很好地总结了这个案例,没有必要重复。
  • '运算符具有高优先级,在您的原始正则表达式中将首先应用'非常感谢您指出这一点!
【解决方案2】:

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

【讨论】:

  • 非常感谢。我不敢相信我在修修补补时没有尝试过。当我开始考虑正则表达式时,我会感到疲倦,哈哈。
【解决方案3】:

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

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

^ 和 $ 代表行的开头和结尾,因此您不希望在 or 条件中考虑它们。括号允许您明确说明“此括号中的所有内容”或“此其他括号中的任何内容”

【讨论】:

    【解决方案4】:

    @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}$
    

    希望对你的理解有所帮助

    【讨论】:

    • 我在发帖前实际上在regexpal.com 尝试了^[A-Z]\d{8}$|^\d{9}$,但它对我不起作用。奇怪的是,我回去又试了一次,现在可以了。但是,MikeC 的答案完全一样,不需要 OR。所以,对我来说,这是最好的情况。 +1 努力和解释。
    【解决方案5】:

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

    【讨论】:

    • @Scott:感谢您的提示。我已经更新了我给出的答案。
    猜你喜欢
    • 2015-07-08
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2021-06-07
    • 2010-12-05
    • 2020-05-18
    相关资源
    最近更新 更多