如何使用 Neovim 正则表达式进行单独选择(两个字符不连续)?

How can I use Neovim regex to make a separated selection (of two characters not following one another)?

我正在尝试替换文本文件中的所有字符串,这些字符串被单引号括起来并以 @ 结尾,后跟任何数字,然后是任何其他字母或 #(s) 的任意组合,如下所示:

'package@1.1.k'
'otherpackage@14'
'anotherpackage@7.8'

我希望 select 单引号并像这样删除它们:

export MYVAR="/dir/'package@1.1.k':$MYVAR" 

至:

export MYVAR="/dir/package@1.1.k:$MYVAR"

在整个文件中。我想出了一种方法来删除两个单独命令中的前面的单引号和前面的单引号(使用 vim 的 zsze,类似于正面和负面的环视):

:%s/'.*@.[0-9]*.*\zs'//g 
:%s/\zs'\ze.*@.[0-9]*.*//g

但是,我对在一次操作中完成它感到好奇,因为我想了解更多关于使用 Neovim 的信息,并将答案应用到未来的操作中。

我实际上在使用 Neovim,如果它带有与此相关的任何附加功能。

您可以将以下正则表达式的匹配项替换为捕获组 1 的内容。

'([^@']*@\d[^@']*)'

Demo

我不熟悉 Vim 的正则表达式引擎,但我知道它非常强大。考虑到我建议的正则表达式没什么特别的(只是使用捕获组)我相信它应该在 Vim.

中工作

正则表达式可以分解如下

'           # match a single quote
(           # begin capture group 1
  [^@']*    # match zero or more characters other than '@' and a single-quote
  @\d       # match '@' followed by a digit ofollowed by zero or more characters
            # other than '@' and a single-quote
  [^@']*    # match zero or more characters other than '@' and a single-quote
)           # end capture group 1
'           # match a single quote

我假设星号之间最多可以有一个“@”,但如果允许更多(例如,如果 'a@11@22*' 将转换为 a@11@22* ) 将正则表达式更改为

'([^']*@\d[^']*)'

您需要使用

%s/'\([^@'0-9]*@[0-9][^']*\)'//g

详情:

  • ' - 单引号
  • \( - 捕获组的开始
    • [^@'0-9]* - @' 和数字
    • 以外的零个或多个字符
    • @ - 一个 @ 字符
    • [0-9] - 一个数字
    • [^']* - 除了 ' 字符
    • 以外的零个或多个字符
  • \)' - 捕获组结束。

替换为,第1组backreference/placeholder。