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

alf*_*eza 3 regex vim

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

问题是我将正则表达式赋给变量然后使用它来进行matchlist.

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

let regex = '\v"(.*)"'
Run Code Online (Sandbox Code Playgroud)

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

let regex = "\v'(.*)'"
Run Code Online (Sandbox Code Playgroud)

但如果我尝试使用它们,例如:

let regex = '\v['|"](.*)['|"]'
Run Code Online (Sandbox Code Playgroud)

要么

let regex = '\v[\'|\"](.*)[\'|\"]'
Run Code Online (Sandbox Code Playgroud)

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

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

也许(可能!)我遗漏了一些非常简单的东西,能够使用两个引号而不用担心实际正则表达式的周围引号.

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

Pet*_*ker 9

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

let regex = '\([''"]\)\(.\{-}\)\1'
Run Code Online (Sandbox Code Playgroud)

或者非常神奇

let regex = '\v([''"])(.{-})\1'
Run Code Online (Sandbox Code Playgroud)

或者你可以使用(因为它不会弄乱你的子匹配):

let regex = '\%("\([^"]*\)"\|''\([^'']*\)''\)'
Run Code Online (Sandbox Code Playgroud)

或者非常神奇:

let regex = '\v%("([^"]*)"|''([^'']*)'')'
Run Code Online (Sandbox Code Playgroud)