正则表达式防止从上一个匹配项中选择字符

时间:2019-03-10 20:26:58

标签: php regex preg-match

我的标题可能无法完全解释我的意思。输入以下字符串:

POWERSTART9^{{2|3}}POWERENDx{{3^EXSTARTxEXEND}}=POWERSTART27^{{1|4}}POWEREND

我在这里想要做的就是隔离像这样的部分:

{{2|3}} or {{1|4}}

以下表达式在一定程度上有效,它选择了第一个{{2 | 3}}没问题:

\{\{(.*?)\|(.*?)\}\}

问题在于,这不只是选择{{2 | 3}}和{{1 | 4}}的第二个字符,因为在第一个字符之后我们有{{3 ^ EXSTARTxEXEND}},所以它需要从{{3开始,一直到第二部分我要的结尾| 4}}

此处在RegExr上突出显示:

enter image description here

我从未对regex感到满意,也无法解决如何阻止它。有任何想法吗?我基本上希望它只匹配确切的模式,而不是包含它的东西。

2 个答案:

答案 0 :(得分:1)

您可以使用

7.1.4

请参见regex demo

如果\{\{((?:(?!{{).)*?)\|(.*?)}} 子字符串中没有{},则可以使用更简单的{{...}}表达式(请参见demo)。

详细信息

  • \{\{([^{}|]*)\|([^{}]*)}}-一个\{\{子字符串
  • {{-捕获组1:不会启动((?:(?!{{).)*?)字符序列({{的任何字符(.),应尽可能少(*?) 3}})
    • {{-除[^{}|]*{}之外的0个或多个字符
  • |-一个\|字符
  • |-捕获组2:0个或多个字符,尽可能少
    • (.*?)-除[^{}]*{之外的0个或多个字符
  • }-一个}}子字符串。

答案 1 :(得分:0)

尝试一下\{\{([^\^|]*)\|([^\^|]*)\}\}

https://regex101.com/r/bLF8Oq/1