我的标题可能并不能完全解释我的意思。请使用以下字符串:
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上突出显示:
我从来没有对正则表达式很好,也无法弄清楚如何阻止它这样做。有任何想法吗?我基本上希望它只匹配确切的模式而不是包含它的东西。
你可以用
\{\{((?:(?!{{).)*?)\|(.*?)}}
如果在{
子串中没有}
和{{...}}
,你可以使用更简单的\{\{([^{}|]*)\|([^{}]*)}}
表达式(参见demo)。
细节
\{\{
- 一个{{
子串((?:(?!{{).)*?)
- 捕获第1组:任何char(.
),尽可能少(*?
),不启动{{
char序列(tempered greedy token)
[^{}|]*
- 除了{
,}
和|
之外的任何0或更多字符\|
- 捕获第2组:任何0或更多字符,尽可能少
|
- 除了(.*?)
和[^{}]*
之外的任何0或更多字符{
- 一个}
子串。试试这个}}
}}