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

Regex 在Vim中匹配单引号或双引号字符串,regex,vim,Regex,Vim,我很难将单引号或双引号字符串与Vim的匹配 正则表达式引擎 问题是我将正则表达式赋给一个变量,然后使用它 要玩匹配列表 例如,假设我知道我在一行中,该行包含一个带引号的字符串,并且我希望匹配它: let regex = '\v"(.*)"' 这将有助于匹配任何双引号的内容。类似地,这将匹配单引号字符串: let regex = "\v'(.*)'" 但如果我尝试同时使用它们,比如: let regex = '\v['|"](.*)['|"]' 或 然后Vim不知道如何处理它,因为它认为一些

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

问题是我将正则表达式赋给一个变量,然后使用它 要玩
匹配列表

例如,假设我知道我在一行中,该行包含一个带引号的字符串,并且我希望匹配它:

let regex = '\v"(.*)"'
这将有助于匹配任何双引号的内容。类似地,这将匹配单引号字符串:

let regex = "\v'(.*)'"
但如果我尝试同时使用它们,比如:

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

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

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

也许(可能!)我缺少了一些非常简单的东西,可以同时使用引号,而不用担心实际正则表达式的引号

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

看看这篇文章


可能在某种程度上有所帮助

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

let regex = '\([''"]\)\(.\{-}\)\1'
或者是非常神奇的

let regex = '\v([''"])(.{-})\1'
或者,您可以使用(因为它不会干扰您的子匹配):

或者用非常神奇的方式:

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

这是我为带引号的字符串编写的一个可行脚本

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

你可以使用
\v(\\[\\”]){-1}
跳过某些内容。

应该使用非贪婪的
\{-}
限定符,而不是
*
来匹配
'quoted'not'quoted'
作为单引号的文本。所以我会使用
让r='\([''']\])。\{-}\1'
@ib I concurrent!谢谢你的建议。我已经相应地更改了我的帖子。您的答案现在有一个错误:您应该使用
*
{-}
,而不是两者都使用。第一行代码应该是
let regex='\([''']\)\(.\{-}\)\1'
,第二行代码应该是
let regex='\v([''''])(.{-})\1'
,在一个单引号字符串中,两个单引号('')代表一个单引号('.-1:他没有试图在语法文件中使用它(而且这个问题已经得到了满意的回答)。
let regex = '\v%("([^"]*)"|''([^'']*)'')'
syntax region myString start=/\v"/ skip=/\v(\\[\\"]){-1}/ end=/\v"/
syntax region myString start=/\v'/ end=/\v'/