在Vim中匹配单引号或双引号字符串

问题描述:

我很难尝试将单引号或双引号字符串与Vim的 正则表达式引擎进行匹配。在Vim中匹配单引号或双引号字符串

问题是我将正则表达式分配给一个变量,然后用 与matchlist一起玩。

例如,假设我知道我是一个包含引号的字符串行,我想匹配它:

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

这样做是可以匹配任何是双引号。同样,这将匹配单引号字符串:

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

,但如果我尝试使用他们两个,如:

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

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

这时,Vim不知道如何处理它,因为它认为一些引号没有在实际的变量定义中被关闭,并且弄乱了正则表达式。

用正则表达式捕获单引号或双引号字符串的最佳方法是什么?

也许(可能!)我错过了一些非常简单的事情,可以使用两个引号,而不用担心实际正则表达式的周围引号。

请注意,我更喜欢单引号正则表达式因为这样我不需要双反斜杠转义。

+2

在单引号字符串中,两个单引号('')表示一个单引号(')。 – Raimondi 2011-05-10 15:10:18

您需要使用反向引用。像这样:

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

看看这个帖子

Replacing quote marks around strings in Vim?

可能有助于在某种程度上

这是一个可行的脚本我为引用字符串的语法编写。

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