正则表达式匹配我不想再匹配的东西
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
试试这个模式:^[^{]*(?=({.*?(?1)?.*?})*[^{]*\^).+$
它使用 recrusion 来确保 ^
字符不会在花括号内。与其解释整个正则表达式,我建议阅读有关正则表达式递归的内容(例如 here)。这样正则表达式就很容易理解了。
我昨天问了一个类似的问题,但我仍然缺乏对正则表达式某些部分的了解。
反正我有这个字符串:
[[{{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
试试这个模式:^[^{]*(?=({.*?(?1)?.*?})*[^{]*\^).+$
它使用 recrusion 来确保 ^
字符不会在花括号内。与其解释整个正则表达式,我建议阅读有关正则表达式递归的内容(例如 here)。这样正则表达式就很容易理解了。