假设我有
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
假设我有
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
或者如果您不想在匹配中包含尾随空格,请添加正向前瞻
\d \w(?= )|\d
当你有两种选择,其中一种是另一种的延伸时,将较长的放在第一位,否则将没有机会匹配。
一个经典的“或”将是|
。例如,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
and A ABC
,那么您可以组合一个(不匹配的)组并在内部定义替代方案(以限制范围):
\d (?:ABC|A ABC) Street
或者使用量词的另一种选择:
\d (?:A )?ABC Street
我认为您需要的可能很简单:
\d( \w)?
请注意,如果您的正则表达式写成\d \w|\d
而不是\d|\d \w
.
这是因为在您的情况下,一旦正则表达式匹配第一个选项,\d
它就会停止搜索新的匹配项,可以这么说。