我说我有
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
答案 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]+
:一个大写字符,后跟至少一个字符(大写或小写)或空格。如果您想要更加静态的检查,例如实际上只匹配ABC
和A ABC
,然后你可以组合一个(不匹配的)组并在里面定义替代方案(以限制范围):
\d (?:ABC|A ABC) Street
使用量词的另一种选择:
\d (?:A )?ABC Street
答案 2 :(得分:14)
我认为你需要的可能只是:
\d( \w)?
请注意,如果将正则表达式编写为\d \w|\d
而不是\d|\d \w
,那么它也会有效。
这是因为在你的情况下,一旦正则表达式与第一个选项\d
匹配,它就会停止搜索新的匹配,可以这么说。