2013-10-05 68 views
2

我想用一個VIM正則表達式來查找可選對單詞。它們可以用其他詞語分開,但它們都必須位於同一行。 例如,如果我想匹配的開啓和關閉,那麼這些應該符合:gvim正則表達式匹配一對單詞

open foo close 
open close 
foo 

這些不應該匹配:

open foo 
open 
foo close 
close 

我曾嘗試使用前瞻和回顧後發來匹配的話,但我似乎無法找到合適的組合。

我知道如何做到這一點的單個字符,但單詞讓我完全失去了。

下面是一個嘗試:

s/\(\(open\)\@=.*\(close\)\@=\)* 

出於同樣的東西,但是用 'a' 和而不是 'C' '開放' 和 '關閉' 我能做到這一點:

s/^\(a[^ac]*c\|[^ac]\)*$ 

這將選擇這些線路(和一個空行)的:

acabcacabbbbcbbb 
ac 
abc 
b 

,但不會選擇

acbbc 
ab 
bc 
a 
c 

這是我正在查找的功能,但帶有文字。

任何幫助將不勝感激。

謝謝! Nachum

編輯: 我正在一個縮進腳本,這會有所幫助。相反,我最終搜索並將單詞轉換爲單個字母。然後我使用了我已經熟悉的方法來匹配單個字符。至少它會在第一次轉換完成後縮短代碼。

+2

即使他們沒有完美地工作,你也應該盡力而爲。這將幫助人們看到你想要做的事情,並讓你知道你做錯了什麼......還有人喜歡看到你試圖自己解決問題的證據。 – smerny

+0

以我自己的嘗試更新。感謝您指出了這一點。 – nachum

回答

2

只要搜索這樣的:

open.*close 
+0

這與OP表示他希望匹配的「foo」(沒有打開或關閉的行)不匹配。 – smerny

0

我相信這是你在找什麼。

^((?!.*open|.*close).*|.*open.*close.*)$ 

分解爲:

(?!.*open|.*close).* - 任何不包括打開或關閉

.*open.*close.* - 這既包括開放和關閉

我不熟悉用vim,但從你展示的內容看,我認爲你看起來像能夠轉換語法。