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

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

我的标题可能并不能完全解释我的意思。请使用以下字符串:

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

我从来没有对正则表达式很好,也无法弄清楚如何阻止它这样做。有任何想法吗?我基本上希望它只匹配确切的模式而不是包含它的东西。

php regex preg-match
2个回答
1
投票

你可以用

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

regex demo

如果在{子串中没有}{{...}},你可以使用更简单的\{\{([^{}|]*)\|([^{}]*)}}表达式(参见demo)。

细节

  • \{\{ - 一个{{子串
  • ((?:(?!{{).)*?) - 捕获第1组:任何char(.),尽可能少(*?),不启动{{ char序列(tempered greedy token[^{}|]* - 除了{}|之外的任何0或更多字符
  • qazxsw poi - 一张qazxsw poi图表
  • \| - 捕获第2组:任何0或更多字符,尽可能少 | - 除了(.*?)[^{}]*之外的任何0或更多字符
  • { - 一个}子串。

0
投票

试试这个}}

}}

© www.soinside.com 2019 - 2024. All rights reserved.