正则表达式匹配的东西,我不想再次

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

昨天我问了一个类似的问题,但我仍然缺乏正则表达式的一些部分的知识。

无论如何我有这个字符串:

[[{{6^-2}}x{{6^3}}|{{6^-2}}]]

我想匹配以下正则表达式:

\[\[(.*?)\^(.*?)\]\]

所以基本上想要隔离如果这个字符串有[[anything ^ anything]]

它的作用在一定程度上,但它也匹配,因为那里的^符号。我不希望这与那些匹配,这个表达式不应该匹配,因为符号是|而不是方括号之间的^

基本上它应该忽略{}内部的部分

编辑提出更多意见:

示例字符串:[[{{hello ^ test}} | {{goodbye}}]]我的模式:[[(。?)\ ^(。?)]]预期匹配:False因为我只想匹配^ if它是由[[]]包围的字符串的外部部分的一部分,如果它在{{}}内部则不是

示例字符串:[[{{hello ^ test}} ^ {{goodbye}}]]我的模式:[[(。?)\ ^(。?)]]预期匹配:为真,因为^内的两侧[[ ]]匹配,忽略{{}}内的内容

示例字符串:[[{{hello ^ test}} ^ {{goodbye ^ test}}]]我的模式:[[(。?)\ ^(。?)]]预期匹配:为真,因为^再次位于{{}}中的两个部分,需要忽略{{}}内的内容

示例字符串:[[{{hello ^ test}} | {{goodbye ^ test}}]]我的模式:[[(。?)\ ^(。?)]]预期匹配:False因为内部没有^ [{]]仅在{{}}内部,应该被忽略

我的模式不起作用,因为它也在{{}}内拾取^符号并匹配它的任一侧,我需要它匹配包含在[[]]而不是{{}中的^的任一侧}}

我希望这是有道理的..

php regex preg-match
2个回答
1
投票
\[\[(\{\{.+?\}\}|[^^{}]+)\^(.+?)\]\]

说明:

\[\[            # 2 opening square brackets
(               # start group 1
    \{\{        # 2 opening curly braces
    .+?         # 1 or more any character, not greedy
    \}\}        # 2 closing curly braces
  |             # OR
    [^^{}]+     # 1 or more NON carret or curly braces
)               # end group 1
\^              # a carret
(.+?)           # group 2, 1 or more any characters, not greedy
\]\]            # 2 closing square brackets

Demo


0
投票

尝试这种模式:^[^{]*(?=({.*?(?1)?.*?})*[^{]*\^).+$

它使用recappe来确保^字符不会在花括号内。我建议阅读有关正则表达式递归(例如here),而不是解释整个正则表达式。那么正则表达式将很容易理解。

Demo

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