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

Regex matching things i don't want to again

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

反正我有这个字符串:

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

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

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

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

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

基本上应该忽略{}

里面的部分

为了更有意义而进行的编辑:

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

示例字符串:[[{{hello^test}}^{{goodbye}}]] 我的模式:[[(.?)\^(.?)]] 预期匹配:正确,因为 [[ ]] 内的 ^ 两边匹配,忽略了 {{ }}

内的内容

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

中的内容

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

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

我希望这是有道理的..

\[\[(\{\{.+?\}\}|[^^{}]+)\^(.+?)\]\]

解释:

\[\[            # 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

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

它使用 recrusion 来确保 ^ 字符不会在花括号内。与其解释整个正则表达式,我建议阅读有关正则表达式递归的内容(例如 here)。这样正则表达式就很容易理解了。

Demo