用组替换Vim

用组替换Vim,vim,replace,Vim,Replace,我试图在vim下进行以下替换: "a": 1, "b": 2, "c": 3 到 vim下的正则表达式似乎与正常正则表达式不同。有人能帮我吗 谢谢 很多正则表达式引擎是不同的,我不知道有一个“正常”正则表达式;Vim是一个相当古老的版本,需要对括号进行转义以生成组\(\),匹配计数的大括号也是如此,\{\},非贪婪匹配不受*?支持,需要是\{-} 这和 从行首到冒号都可以 任何东西(非贪婪) 行的末尾有一个逗号,或没有逗号 并替换为group1:d[group1]group2您的文件同时包

我试图在vim下进行以下替换:

"a": 1,
"b": 2,
"c": 3

vim下的正则表达式似乎与正常正则表达式不同。有人能帮我吗

谢谢

很多正则表达式引擎是不同的,我不知道有一个“正常”正则表达式;Vim是一个相当古老的版本,需要对括号进行转义以生成组
\(\)
,匹配计数的大括号也是如此,
\{\}
,非贪婪匹配不受
*?
支持,需要是
\{-}

这和

  • 从行首到冒号都可以
  • 任何东西(非贪婪)
  • 行的末尾有一个逗号,或没有逗号

并替换为
group1:d[group1]group2

您的文件同时包含冒号和全宽冒号,这使得替换有点难以处理

如果在光标位于第一行和第二行的
字符上方时键入
ga
字符,您会发现它们不一样。

事实上,对于第一行,您将得到全宽冒号:

<:> 65306, Hexa ff1a, Octal 177432 
<:>  58,  Hexa 3a,  Octal 072 

您可以注意到第二组中的
%uFF1A
,它以十六进制表示全宽冒号。

您可以选择使用递归宏。

在第一行,清空q寄存器

qqq
启动q宏

qq
执行一次作业,然后通过调用宏本身来完成宏(这就是为什么必须首先清空q寄存器)

然后你执行它

@q
您也可以尝试这种替代方法

:%s/^\("\S\{-}"\): \d\+\(,\?\)$/\1: d[\1]\2/

@是的,当然,还有。你有没有试着清楚地解释你想表达什么?读我的答案你会明白的。您没有像问题中的OP那样复制精确的行。@Meninx-当我只是复制/粘贴OP的示例时,它粘贴为纯ascii,这个答案按原样工作。我首先求助于Powershell来获取实际的unicode字符。将vim中的编码设置为utf-8至少会将第一个冒号显示为“特殊”字符。新缓冲区的编码总是utf-8吗?这就解释了区别。你可以试着选择OP例子中的冒号,你就会知道他使用的是utf-8编码。一些有帮助的人甚至想出了产生此类问题的方法。;)
qq
0yt:f ad[]<ESC>Pf]lC,<ESC>j0@q
q
@q
:%s/^\("\S\{-}"\): \d\+\(,\?\)$/\1: d[\1]\2/