【问题标题】:OR condition in Regex正则表达式中的 OR 条件
【发布时间】:2013-04-13 09:13:14
【问题描述】:

假设我有

1 ABC Street
1 A ABC Street

\d 匹配 1(我的预期),\d \w 匹配 1 A (预期)。当我将模式组合在一起\d|\d \w 时,它只匹配第一个但忽略第二个。

我的问题是在这种特殊情况下如何正确使用“或”条件?

PS:条件是数字只有在后面没有单个字母时才换行,否则将数字和单个字母都换行。

示例:1 ABC Street 仅匹配数字 1,但当 1 A ABC Street 将 1 A

【问题讨论】:

  • 不一定非要用|,例如:\d( \w)?
  • \d(\w)?必须解决你的难题。

标签: regex


【解决方案1】:

试试

\d \w |\d

如果您不想在匹配项中包含尾随空格,请添加正向前瞻

\d \w(?= )|\d

当你有两种选择,其中一种是另一种的延伸,把较长的放在第一位,否则将没有机会匹配。

【讨论】:

    【解决方案2】:

    经典的“或”是|。例如,ab|de 将匹配表达式的任一侧。

    但是,对于您的情况,您可能希望使用 ? 量词,它将精确匹配前一个表达式 0 或 1 次(首选 1 次;即它是“贪婪”匹配)。另一种(可能更可靠)的替代方法是使用自定义字符组:

    \d+\s+[A-Z\s]+\s+[A-Z][A-Za-z]+
    

    此模式将匹配:

    • \d+:一个或多个数字。
    • \s+:一个或多个空格。
    • [A-Z\s]+:一个或多个大写字符或空格字符
    • \s+:一个或多个空格。
    • [A-Z][A-Za-z\s]+:一个大写字符后跟至少一个字符(大写或小写)或空格。

    如果您想要更静态的检查,例如确实只匹配ABC 和A ABC,然后您可以组合一个(不匹配的)组并在内部定义替代项(以限制范围):

    \d (?:ABC|A ABC) Street
    

    或者使用量词的另一种选择:

    \d (?:A )?ABC Street
    

    【讨论】:

    • 这似乎有点傻\s+[A-Z\s]+\s+ - 为什么你需要在三个不同的地方匹配空白?当然[A-Z\s]+ 或\s+[A-Z]+\s+ 更有意义...
    • 嗯,是的,仔细想想,在我删除“第一个或最后一个必须是字母”的要求后,这有点矫枉过正。 :) 编辑……与否。它仍然很有用,因为这样我强制前导/尾随空格,同时允许括号匹配多个单词。
    • 这肯定是环视的情况吗?
    【解决方案3】:

    我认为您需要的可能很简单:

    \d( \w)?
    

    请注意,如果您的正则表达式写成\d \w|\d 而不是\d|\d \w,它也会起作用。

    这是因为在您的情况下,一旦正则表达式匹配第一个选项 \d,它就会停止搜索新匹配项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-15
      • 2010-09-16
      • 2020-05-01
      • 1970-01-01
      • 2012-07-17
      • 2021-08-08
      • 2021-10-25
      相关资源
      最近更新 更多