用于捕获自身部分(之前和之后)的正则表达式,贪婪匹配

问题描述 投票:0回答:1

我希望使用单个正则表达式从字符串

USD 123
中获取匹配项
123 USD
USD 123 USD

这可能吗?

明显的正则表达式

((USD)\s?(123)\s?)|(123\s?(USD)?)
不起作用——这对我来说似乎有点迷失。

我在这里遗漏了一些明显的东西吗?

编辑1:美元部分不是恒定的,并且作为配置列表中的变量不断变化。

编辑 2:首选语言 - python。不过,可以灵活地接受其他语言的答案。

看到评论真是太棒了。请添加为答案,以便我接受最好的答案!

regex
1个回答
1
投票

答案取决于您使用的环境。在大多数支持捕获组环视的正则表达式风格中,重叠匹配可以被在前瞻中捕获

  1. 使用PHP(PCRE)和分支重置来获取同一中的匹配:

    (?|(123 USD)|(?=(USD 123)))
    

    请参阅 regex101 上的演示。它要么通常匹配并捕获交替的左侧选项捕获右侧选项内部一个前瞻到相同的第一组

    在此变体中,需要将重叠的子字符串放入前瞻中,以防止消耗部分并允许其他选项的正常匹配。在 PHP 中,您可以使用

    preg_match_all
    tio.runPHP 演示获取第一组的匹配。

    我也希望@Steve4585将他的评论转换为答案,这个方法对我来说是新的!

  2. 使用Python和替代品PyPI正则表达式模块:

    有一个可用的

    overlapped
    标志,它允许非常基本的模式(Python 演示)。

    m = regex.findall(r"USD 123|123 USD", s, overlapped=True)
    
© www.soinside.com 2019 - 2024. All rights reserved.