2015-03-02 146 views
0

我試圖找到一個匹配{% foo %}的Vim正則表達式,但如果foo包含一個管道後面跟着escape這個字,它就不會匹配。Vim正則表達式:如何搜索不包含其他字符串的字符串?

所以,

  • {% this is a test %}比賽
  • {% this is a test|something %}比賽
  • {% this is a test|escape %}不匹配
  • {% this is a test|something escape something-else %}不匹配

我一直在向前看符號和lookbehinds和我嘗試只是無法弄清楚。

回答

0

\{%[^|]*?%\}怎麼樣。 [^|]與任何東西匹配,除了管道。 *?意味着它是一個所有格匹配,而不是一個貪婪的匹配 - 它會停止,如果它看到%}而不是匹配的默認貪婪行爲,直到找到它的最後%}

編輯註釋:爲避免包含單詞「escape」的匹配項,您可以按照您的建議使用負面預覽:(?!.*escape.*)\{%.*?%\}

+0

'?'是一個很好的觀點。但是,我意識到我需要澄清我的問題:可能有一個管道,但「逃脫」不能在它之後。對不起'回合。 – abeger 2015-03-02 21:37:47

0

您可以使用否定前瞻斷言:

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

,檢查是不會有一個管道,後跟字escape,直到行結束,所以現在添加匹配與非任意字符串-greddy量詞:

\s*.{-} 

請注意,我使用的是非常神奇的模式。它得到這樣的:

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

試試這個:

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

解釋:

  • {%*測試* | *逃逸*%。}: 「測試」,然後一個管道,然後在{%...%}中「逃脫」
  • \(foo \)\ @! :UNMATCH如果與 「富」 的原子匹配
  • {%*測試*%。}:匹配你想要什麼

「的比賽,在不包含句子{%然後test然後|然後escape然後%},句子{%.\*test.\*%}

相關問題