2011-05-19 200 views
2

我有一個文件包含字符串像這樣的:爲什麼我必須逃脫最終]

print $hash_xml->{'div'}{'div'}{'div'}[1]... 

我想別的東西來代替{'div'}{'div'}{'div'}[1]

所以,我想

%s/{'div'}{'div'}{'div'}[1]/by something else/gc 

均未發現該字符串。不過,我覺得我必須逃離找不到{}[]

還是字符串。

所以我試圖搜索一個{,它發現了它們。 然後我試圖搜索{'div'}{'div'}{'div'},它再次找到它。
Then {'div'}{'div'}{'div'}[1 was still found。

要找到{'div'}{'div'}{'div'}[1]

我不得不使用%s/{'div'}{'div'}{'div'}[1\]

爲什麼?

VIM 7.3在Linux

+1

incsearch'(簡稱'is')可能對這些情況非常有用,以防萬一您不知道。 – sidyll 2011-05-19 16:45:00

回答

5

這是因爲[]字符用於構建搜索模式。

:h pattern和使用幫助文件pattern.txt嘗試以下實驗:使用/[0-9]將每個數字匹配從0到9

  • 搜索了「[9-0]」模式(不帶引號)單獨(見:h \[

  • 現在,如果你嘗試/\[0-9]/[0-9\]你會匹配整個模式:一個零,一個連字符和一個九方括號內。這是因爲當您轉義[]之一時,運營商[*]不再存在。

使用您的搜索模式,/{'div'}{'div'}{'div'}[1\]/{'div'}{'div'}{'div'}\[1]應該匹配這是你想要的一個相同的模式,而/{'div'}{'div'}{'div'}[1]字符串匹配{'div'}{'div'}{'div'}1

7

的[]中的正則表達式用來包裝的範圍內可接受的字符。

當兩者均未轉義時,vim將搜索字符串視爲正則表達式。因此,當你離開它或者逃避最後一個字符時,vim不能在正則表達式上下文中解析單個括號,文字搜索(基本上它是給定搜索字符串可以做的最好的)也不能解釋。

就我個人而言,我會逃避開幕式和閉幕式的方括號,以確保意思是明確的。

1

由於方括號表示vim認爲你正在尋找裏面的任何字符。這被稱爲「角色班」。通過轉義方括號,它可以讓vim知道你正在尋找以'[1]'結尾的文字方塊字符串。

理想情況下,你應該寫你的表達爲:

%s/{'div'}{'div'}{'div'}\[1\]/replacement string/

,以確保含義是完全清楚。

2

爲了避免在正則表達式中被這些特殊字符捕獲,您可以嘗試使用very magic標誌。

例如爲:

:%s/\V{'div'}[1]/replacement/ 

注意在該行的開頭\V標誌。