如何使用Neovim正则表达式来进行分离选择(选择两个不相邻的字符)?

3

我正在尝试替换文本文件中所有被单引号包围并以@开头,后跟任意数字和任意混合的字母或#的字符串,例如:

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

我希望只选择单引号并将其删除,方法如下:

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

to:

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

在整个文件中,我找到了一种方法可以使用两个单独的命令(使用vim的zsze,类似于正向和反向环视)来删除前面的单引号和后面的单引号:

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

然而,我对一次性完成此操作很感兴趣,因为我想了解更多关于使用Neovim的知识,并将答案应用到未来的操作中。

实际上,我正在使用Neovim,如果这有任何与此相关的额外功能。


@CarySwoveland 对不起,那是打错了。我想说的是“followed by”。谢谢,我已经修正了我的问题。然而,我知道匹配的正则表达式,我的主要问题是如何选择两个字符(或在另一种情况下可能是字符串),它们被其他字符和/或空格分隔开,而不选择它们之间的内容。 - eyeseaevan
2个回答

4

您需要使用

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

详细信息:

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

替换值为\1,表示第一组的反向引用/占位符。


非常感谢!:) 对于任何对如何插入/替换两个选择而不是删除它们感到困惑的人-请将%s/命令中外部的''替换为您希望替换的字符。在/之后的替换字段中,将要用第一个选择替换的内容放在\1反向引用之后,将要用第二个选择替换的内容放在其后,就像这样........::%s/'\([^@'0-9]*@[0-9][^']*\)'/PREPEND\1APPEND - eyeseaevan

3
您可以用捕获组1的内容替换以下正则表达式的匹配项。
'([^@']*@\d[^@']*)'

演示

我不熟悉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[^']*)'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接