首页 > 解决方案 > 正则表达式匹配我不想再匹配的东西

问题描述

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

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

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

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

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

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

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

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

更有意义的编辑:

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

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

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

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

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

我希望这是有道理的..

标签: phpregexpreg-match

解决方案


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

解释:

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

演示


推荐阅读