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

Regex prevent selecting characters from previous match

我的标题可能没有准确解释我的意思。取下面的字符串:

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

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

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

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

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

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

此处在 RegExr 上突出显示:

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

您可以使用

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

参见regex demo

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

详情

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

试试这个 \{\{([^\^|]*)\|([^\^|]*)\}\}

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