Vim Regex:如何搜索不带';不包含其他字符串?
我正在试图找到一个Vim正则表达式,它将匹配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,但我就是搞不懂。怎么样\{%[
{%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
不可能在后面。对不起。