在Vim中匹配单引号或双引号字符串
我很难尝试将单引号或双引号字符串与Vim的 正则表达式引擎进行匹配。在Vim中匹配单引号或双引号字符串
问题是我将正则表达式分配给一个变量,然后用 与matchlist
一起玩。
例如,假设我知道我是一个包含引号的字符串行,我想匹配它:
let regex = '\v"(.*)"'
这样做是可以匹配任何是双引号。同样,这将匹配单引号字符串:
let regex = "\v'(.*)'"
,但如果我尝试使用他们两个,如:
let regex = '\v['|"](.*)['|"]'
或
let regex = '\v[\'|\"](.*)[\'|\"]'
这时,Vim不知道如何处理它,因为它认为一些引号没有在实际的变量定义中被关闭,并且弄乱了正则表达式。
用正则表达式捕获单引号或双引号字符串的最佳方法是什么?
也许(可能!)我错过了一些非常简单的事情,可以使用两个引号,而不用担心实际正则表达式的周围引号。
请注意,我更喜欢单引号正则表达式因为这样我不需要双反斜杠转义。
您需要使用反向引用。像这样:
let regex = '\([''"]\)\(.\{-}\)\1'
还是非常魔法
let regex = '\v([''"])(.{-})\1'
或者您可以使用(因为它不会与你的子匹配乱):
let regex = '\%("\([^"]*\)"\|''\([^'']*\)''\)'
或具有非常神奇:
let regex = '\v%("([^"]*)"|''([^'']*)'')'
应该使用非贪婪的'\ { - }'限定符而不是'*'不要将'quoted'而不是'quoted''作为单引号文字。所以我会用'let r ='\([''“] \)。\ { - } \ 1''。 – 2011-05-10 14:08:45
@ib我同意!谢谢你的好建议。我已经相应地更改了我的帖子。 – 2011-05-10 14:12:56
你的回答现在有一个错误:你应该使用'*'或'{ - }',而不是两者。第一个代码行应该是'let regex ='\([''“] \)\(。\ { - } \)\ 1''和第二个'let regex ='\ v([''”] )(。{ - })\ 1'' – 2011-05-11 02:44:22
这是一个可行的脚本我为引用字符串的语法编写。
syntax region myString start=/\v"/ skip=/\v(\\[\\"]){-1}/ end=/\v"/
syntax region myString start=/\v'/ end=/\v'/
您可以使用\v(\\[\\"]){-1}
跳过某些内容。
-1:他没有试图在语法文件中使用它(问题也得到了令人满意的回答)。 – 2011-11-20 05:46:11
在单引号字符串中,两个单引号('')表示一个单引号(')。 – Raimondi 2011-05-10 15:10:18