我很难尝试将单引号或双引号字符串与Vim匹配 正则表达式引擎。
问题在于我将正则表达式赋给变量然后使用它
与matchlist
一起玩。
例如,假设我知道我在一个包含带引号的字符串的行中,我想匹配它:
let regex = '\v"(.*)"'
这可以匹配任何双引号。同样,这将匹配单引号字符串:
let regex = "\v'(.*)'"
但如果我尝试同时使用它们,例如:
let regex = '\v['|"](.*)['|"]'
或
let regex = '\v[\'|\"](.*)[\'|\"]'
然后Vim不知道如何处理它,因为它认为在实际的变量定义中没有关闭某些引号并且它会弄乱正则表达式。
使用正则表达式捕获单引号或双引号字符串的最佳方法是什么?
也许(可能!)我遗漏了一些非常简单的东西,能够使用两个引号而不用担心实际正则表达式的周围引号。
请注意,我更喜欢单引号用于正则表达式,因为这样我就不需要使用双反斜杠进行转义。
答案 0 :(得分:9)
您需要使用反向引用。像这样:
let regex = '\([''"]\)\(.\{-}\)\1'
或者非常神奇
let regex = '\v([''"])(.{-})\1'
或者你可以使用(因为它不会弄乱你的子匹配):
let regex = '\%("\([^"]*\)"\|''\([^'']*\)''\)'
或非常神奇:
let regex = '\v%("([^"]*)"|''([^'']*)'')'
答案 1 :(得分:-1)
答案 2 :(得分:-2)
这是一个可行的脚本,我为引用的字符串编写了语法。
syntax region myString start=/\v"/ skip=/\v(\\[\\"]){-1}/ end=/\v"/
syntax region myString start=/\v'/ end=/\v'/
您可以使用\v(\\[\\"]){-1}
跳过某些内容。