正则表达式中的OR条件

Hoa*_*ang 48 regex

我想说

1 ABC Street
1 A ABC Street
Run Code Online (Sandbox Code Playgroud)

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

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

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

例如:1 ABC街比赛只有1号,但是当1 ABC街包裹1 A时

Mik*_*keM 60

尝试

\d \w |\d
Run Code Online (Sandbox Code Playgroud)

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

\d \w(?= )|\d
Run Code Online (Sandbox Code Playgroud)

当你有两个选择,其中一个是另一个的扩展时,先把较长的一个放在第一个,否则就没有机会匹配.


Mar*_*rio 27

经典的"或"将是|.例如,ab|de将匹配表达式的任一侧.

但是,对于类似你的情况,你可能想要使用?量词,它将前一个表达式精确匹配0或1次(首选1次;即它是"贪婪"匹配).另一种(可能更可靠的)替代方案是使用自定义字符组:

\d+\s+[A-Z\s]+\s+[A-Z][A-Za-z]+
Run Code Online (Sandbox Code Playgroud)

此模式将匹配:

  • \d+:一个或多个数字.
  • \s+:一个或多个空格.
  • [A-Z\s]+:一个或多个大写字符或空格字符
  • \s+:一个或多个空格.
  • [A-Z][A-Za-z\s]+:大写字符后跟至少一个字符(大写或小写)或空格.

如果您想更静态检查,如确实只匹配ABCA ABC,那么你就可以结合(不匹配)组,定义里面的替代品(限制范围):

\d (?:ABC|A ABC) Street
Run Code Online (Sandbox Code Playgroud)

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

\d (?:A )?ABC Street
Run Code Online (Sandbox Code Playgroud)


Ron*_*ael 16

我认为你需要的可能是简单的:

\d( \w)?
Run Code Online (Sandbox Code Playgroud)

请注意,如果将其写成\d \w|\d代替,那么正则表达式也会起作用\d|\d \w.

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