我试图找到一个匹配{% foo %}
的Vim正则表达式,但如果foo
包含一个在其后面某处包含单词escape
的管道,则不会匹配。
所以,
{% this is a test %}
匹配{% this is a test|something %}
匹配{% this is a test|escape %}
不匹配{% this is a test|something escape something-else %}
不匹配我一直在尝试前瞻和外观,我无法弄清楚。
答案 0 :(得分:0)
\{%[^|]*?%\}
怎么样? [^|]
匹配除管道之外的任何内容。此外,*?
表示它具有占有性匹配,而不是贪婪的匹配 - 如果它看到%}
而不是默认的贪婪行为,直到最后%}
它就会停止发现。
修改评论:为避免包含单词" escape"的匹配,您可以按照建议使用否定前瞻:(?!.*escape.*)\{%.*?%\}
。
答案 1 :(得分:0)
您可以使用否定前瞻声明:
(.*\|.*escape.*)@!
检查不会是一个管道后跟单词escape
直到行尾,所以现在为任何带有非greddy量词的字符串添加匹配:
\s*.{-}
请注意,我使用了非常神奇的模式。它变得像:
/\v\{\%(.*\|.*escape.*)@!\s*.{-}\%\}
答案 2 :(得分:0)
试试这个:
\({%.*test.*|.*escape.*%}\)\@!{%.*test.*%}
解释:
"匹配,在不包含{%
然后test
然后|
然后escape
然后%}
的句子中,句子{{1} }"