正则表达式中的OR条件

时间:2013-04-13 09:13:14

标签: regex

我说我有

1 ABC Street
1 A ABC Street

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

我的问题是如何在这种特殊情况下正确使用或调节?

PS:条件是仅在此后没有单个字母时包装数字,否则包装数字和单个字母。

例如: 1 ABC Street 仅匹配数字1,但当 1 ABC街 包裹< strong> 1 A

3 个答案:

答案 0 :(得分:52)

尝试

\d \w |\d

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

\d \w(?= )|\d

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

答案 1 :(得分:24)

经典的“或”将是|。例如,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]+:一个大写字符,后跟至少一个字符(大写或小写)或空格。

如果您想要更加静态的检查,例如实际上只匹配ABCA ABC,然后你可以组合一个(不匹配的)组并在里面定义替代方案(以限制范围):

\d (?:ABC|A ABC) Street

使用量词的另一种选择:

\d (?:A )?ABC Street

答案 2 :(得分:14)

我认为你需要的可能只是:

\d( \w)?

请注意,如果将正则表达式编写为\d \w|\d而不是\d|\d \w,那么它也会有效。

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