我希望使用单个正则表达式从字符串
USD 123
中获取匹配项 123 USD
和 USD 123 USD
。
这可能吗?
明显的正则表达式
((USD)\s?(123)\s?)|(123\s?(USD)?)
不起作用——这对我来说似乎有点迷失。
我在这里遗漏了一些明显的东西吗?
编辑1:美元部分不是恒定的,并且作为配置列表中的变量不断变化。
编辑 2:首选语言 - python。不过,可以灵活地接受其他语言的答案。
看到评论真是太棒了。请添加为答案,以便我接受最好的答案!
答案取决于您使用的环境。在大多数支持捕获组和环视的正则表达式风格中,重叠匹配可以被在前瞻中捕获。
(?|(123 USD)|(?=(USD 123)))
请参阅 regex101 上的演示。它要么通常匹配并捕获交替的左侧选项或捕获右侧选项内部一个前瞻到相同的第一组。
在此变体中,需要将重叠的子字符串放入前瞻中,以防止消耗部分并允许其他选项的正常匹配。在 PHP 中,您可以使用
preg_match_all
⇒ tio.runPHP 演示获取第一组的匹配。
我也希望@Steve4585将他的评论转换为答案,这个方法对我来说是新的!
使用Python和替代品PyPI正则表达式模块:
有一个可用的
overlapped
标志,它允许非常基本的模式(Python 演示)。
m = regex.findall(r"USD 123|123 USD", s, overlapped=True)