2011-05-10 245 views
3

我很難嘗試將單引號或雙引號字符串與Vim的 正則表達式引擎進行匹配。在Vim中匹配單引號或雙引號字符串

問題是我將正則表達式分配給一個變量,然後用 與matchlist一起玩。

例如,假設我知道我是一個包含引號的字符串行,我想匹配它:

let regex = '\v"(.*)"' 

這樣做是可以匹配任何是雙引號。同樣,這將匹配單引號字符串:

let regex = "\v'(.*)'" 

,但如果我嘗試使用他們兩個,如:

let regex = '\v['|"](.*)['|"]' 

let regex = '\v[\'|\"](.*)[\'|\"]' 

這時,Vim不知道如何處理它,因爲它認爲一些引號沒有在實際的變量定義中被關閉,並且弄亂了正則表達式。

用正則表達式捕獲單引號或雙引號字符串的最佳方法是什麼?

也許(可能!)我錯過了一些非常簡單的事情,可以使用兩個引號,而不用擔心實際正則表達式的周圍引號。

請注意,我更喜歡單引號正則表達式因爲這樣我不需要雙反斜槓轉義。

+2

在單引號字符串中,兩個單引號('')表示一個單引號(')。 – Raimondi 2011-05-10 15:10:18

回答

8

您需要使用反向引用。像這樣:

let regex = '\([''"]\)\(.\{-}\)\1' 

還是非常魔法

let regex = '\v([''"])(.{-})\1' 

或者您可以使用(因爲它不會與你的子匹配亂):

let regex = '\%("\([^"]*\)"\|''\([^'']*\)''\)' 

或具有非常神奇:

let regex = '\v%("([^"]*)"|''([^'']*)'')' 
+0

應該使用非貪婪的'\ { - }'限定符而不是'*'不要將'quoted'而不是'quoted''作爲單引號文字。所以我會用'let r ='\([''「] \)。\ { - } \ 1''。 – 2011-05-10 14:08:45

+0

@ib我同意!謝謝你的好建議。我已經相應地更改了我的帖子。 – 2011-05-10 14:12:56

+0

你的回答現在有一個錯誤:你應該使用'*'或'{ - }',而不是兩者。第一個代碼行應該是'let regex ='\([''「] \)\(。\ { - } \)\ 1''和第二個'let regex ='\ v([''」] )(。{ - })\ 1'' – 2011-05-11 02:44:22

-2

這是一個可行的腳本我爲引用字符串的語法編寫。

syntax region myString start=/\v"/ skip=/\v(\\[\\"]){-1}/ end=/\v"/ 
syntax region myString start=/\v'/ end=/\v'/ 

您可以使用\v(\\[\\"]){-1}跳過某些內容。

+0

-1:他沒有試圖在語法文件中使用它(問題也得到了令人滿意的回答)。 – 2011-11-20 05:46:11

相關問題