我如何使用Neovim regex使一个分开的选择(两个字符不跟随另一个)?



我试图替换文本文件中由单引号包围的所有字符串,并以@开头,然后是任何数字,然后是任何其他字母(s)或#(s)的任何组合,如:

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

和我希望只选择单引号,然后像这样删除它们:

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,如果它附带任何与此相关的附加功能

你需要使用

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

:

  • '-单引号
  • (—抓包组启动
    • [^@'0-9]*- 0个或多个除@,'和数字以外的字符
    • @- a@char
    • [0-9]-一个数字
    • [^']*- 0个或多个'字符以外的字符
  • )'-捕获组结束。

替代1,第1组反向引用/占位符。

可以用捕获组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[^']*)'

相关内容

  • 没有找到相关文章

最新更新