Neovim中:substitute命令捕获组失效及引用方式咨询
在Neovim的
:substitute中使用捕获组的解决方案 为什么你的命令报错?
Neovim默认的:substitute使用非魔法模式(nomagic),此时括号()会被当作普通字符处理,不是捕获组的语法标记,所以正则无法匹配到目标内容,触发E486: Pattern not found错误。
启用捕获组的两种方法
方法1:使用魔法模式(推荐)
在正则模式前添加\v(表示very magic),此时()会被识别为捕获组的边界,无需转义。替换部分用\1、\2引用对应的捕获组:
:s/\v(myKey:\s*)(.*)/\1something-\2/
\v:开启魔法模式,简化正则语法(myKey:\s*):第一个捕获组,匹配myKey:和后续的空白字符(.*):第二个捕获组,匹配剩余的所有内容\1:引用第一个捕获组的内容,\2引用第二个捕获组的内容
方法2:在非魔法模式中转义括号
如果不想开启魔法模式,需要将捕获组的括号转义为\(和\),替换部分同样用\1、\2引用:
:s/\(myKey:\s*\)\(.*\)/\1something-\2/
Neovim中捕获组的引用方式
- 默认vim兼容风格:使用
\1、\2...\9引用编号捕获组,\0表示匹配整个正则模式的内容,这是:substitute命令的标准用法。 - Perl风格的
$1引用:Neovim默认不支持直接在:substitute中用$1,如果需要这种写法,可以通过\=表达式结合submatch()函数实现:
其中:s/\v(myKey:\s*)(.*)/\=submatch(1).'something-'.submatch(2)/submatch(1)对应第一个捕获组,submatch(2)对应第二个捕获组,通过字符串拼接完成替换。
内容的提问来源于stack exchange,提问作者jeremywat
相关产品推荐
相关产品推荐

