66

假设我有

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

4

3 回答 3

78

尝试

\d \w |\d

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

\d \w(?= )|\d

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

于 2013-04-13T09:43:57.467 回答
42

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

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

\d (?:ABC|A ABC) Street

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

\d (?:A )?ABC Street
于 2013-04-13T09:22:53.747 回答
18

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

\d( \w)?

请注意,如果您的正则表达式写成\d \w|\d而不是\d|\d \w.

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

于 2013-04-13T09:46:10.560 回答