或在 Regex 的情况

就算是吧

1 ABC Street
1 A ABC Street

对于 \d,它匹配 < em > 1 (我所期望的) ,对于 \d \w,它匹配 < em > 1 A (所期望的)。当我将这些模式组合在一起时,\d|\d \w只匹配第一个模式,而忽略第二个模式。

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

附言: 条件是只有当后面没有单个字母时才包装数字,否则包装数字和单个字母。

示例: ABC 街1号只匹配数字1,但是当 < em > 1 A ABC 街 包装 < em > 1 A

344798 次浏览

一个经典的“或”应该是 |。例如,ab|de应该匹配表达式的任意一边。

但是,对于类似的情况,您可能需要使用 ?量词,它将与前面的表达式完全匹配0或1次(1次优先; 也就是说,它是一个“贪婪”匹配)。另一个(可能更可靠)选择是使用自定义字符组:

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

这种模式将会匹配:

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

如果您想要一个更加静态的检查,例如,实际上只匹配 ABCA ABC,那么您可以组合一个(非匹配)组,并在其中定义备选方案(以限制范围) :

\d (?:ABC|A ABC) Street

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

\d (?:A )?ABC Street

试试看

\d \w |\d

或者添加一个积极的前瞻,如果你不想在比赛中包括尾随空间

\d \w(?= )|\d

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

我想你需要的可能很简单:

\d( \w)?

注意,如果正则表达式被写成 \d \w|\d而不是 \d|\d \w,那么它也可以工作。

这是因为在您的示例中,一旦正则表达式与第一个选项 \d匹配,它就停止搜索新的匹配,可以这么说。