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

时间:2015-03-02 21:24:15

标签: regex vim

我试图找到一个匹配{% 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 %}不匹配

我一直在尝试前瞻和外观,我无法弄清楚。

3 个答案:

答案 0 :(得分:0)

\{%[^|]*?%\}怎么样? [^|]匹配管道之外的任何内容。此外,*?表示它具有占有性匹配,而不是贪婪的匹配 - 如果它看到%}而不是默认的贪婪行为,直到最后%}它就会停止发现。

修改评论:为避免包含单词" escape"的匹配,您可以按照建议使用否定前瞻:(?!.*escape.*)\{%.*?%\}

答案 1 :(得分:0)

您可以使用否定前瞻声明:

(.*\|.*escape.*)@!

检查不会是一个管道后跟单词escape直到行尾,所以现在为任何带有非greddy量词的字符串添加匹配:

\s*.{-}

请注意,我使用了非常神奇的模式。它变得像:

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

答案 2 :(得分:0)

试试这个:

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

解释:

  • {%。* test。* |。* escape。*%}:"测试",然后是管道,然后"逃避"在{%...%}
  • \(FOO \)\ @! :如果原子带有" foo"则不匹配匹配
  • {%。* test。*%}:匹配您想要的内容

"匹配,在不包含{%然后test然后|然后escape然后%}的句子中,句子{{1} }"