Vim Regex:如何搜索不带';不包含其他字符串?

Vim Regex:如何搜索不带';不包含其他字符串?,regex,vim,Regex,Vim,我正在试图找到一个Vim正则表达式,它将匹配{%foo%},但如果foo包含一个在其后某处带有单词escape的管道,它将不匹配 所以 {%this is a test%}匹配 {%this is a test | something%}匹配 {%this is a test | escape%}不匹配 {%this is a test | something escape something%}不匹配 我一直在试验lookaheads和lookbehinds,但我就是搞不懂。怎么样\{%[

我正在试图找到一个Vim正则表达式,它将匹配
{%foo%}
,但如果
foo
包含一个在其后某处带有单词
escape
的管道,它将不匹配

所以

  • {%this is a test%}
    匹配
  • {%this is a test | something%}
    匹配
  • {%this is a test | escape%}
    不匹配
  • {%this is a test | something escape something%}
    不匹配

我一直在试验lookaheads和lookbehinds,但我就是搞不懂。

怎么样
\{%[^ 124;]*?%\}
[^ |]
匹配除管道以外的任何对象。另外,
*?
表示它是所有格匹配,而不是贪婪匹配-如果它看到
%}
,它将停止匹配,而不是默认的贪婪匹配行为,直到找到最后一个
%}


编辑以供评论:为了避免包含单词“escape”的匹配,如您所建议的,您可以使用负前瞻:
(?!*escape.*.\{%.*?%\}

您可以使用负前瞻断言:

(.*\|.*escape.*)@!
这将检查在行尾之前不会有一个管道后跟单词
escape
,因此现在为任何带有非灰色量词的字符串添加匹配项:

\s*.{-}
请注意,我使用的是非常神奇的模式。它变得像:

/\v\{\%(.*\|.*escape.*)@!\s*.{-}\%\}
试试这个:

\({%.*test.*|.*escape.*%}\)\@!{%.*test.*%}
说明:

  • {%.*test.*.|.*escape.*%}:“test”,然后是管道,然后是{%…%}中的“escape”
  • \(foo\)\@!:如果原子与“foo”匹配,则取消匹配
  • {%.*test.*%}:匹配您想要的

“匹配,在一个不包含
{%
然后
测试
然后
{/code>然后
转义
然后
%}
的句子中,
{%.\*.\*%}

这个
是一个很好的观点。然而,我意识到我需要澄清我的问题:可能有一个管道,但是
escape
不可能在后面。对不起。