如何在vim中表达对先前模式的修改?

时间:2014-11-28 02:37:11

标签: regex vim

我有一系列数据,例如a, b, c, d, e, f, g,我需要将它们转换为'a', 'b', 'c', 'd', 'e', 'f', 'g'

所以我先在视觉模型中选择它们,然后我做了s/[a-z],/'&'/g

但结果却将它们转换为'a,' 'b,' 'c,' 'd,' 'e,' 'f,' 'g,'

我怎么能保留上一封信并将逗号移到第二个单引号的后面?

PS:我需要使用这些逗号来定位模式,因为还有其他字母没有逗号。

2 个答案:

答案 0 :(得分:1)

您可以尝试以下vim搜索和替换功能。

:%s/\([a-z]\+\),/'\1',/g

\([a-z]\+\)捕获一个或多个小写字母。稍后将通过反向引用来引用这些字符。 \1指的是组索引1中存在的字符。

您的正则表达式s/[a-z],/'&'/g出了什么问题?

[a-z],匹配任何小写字母和以下逗号。替换部分中的&将打印整场比赛。因此,在我们的示例中,匹配的字符将替换为' +匹配+ '。请注意,您的匹配包含逗号,因此您获得了'a,'而不是'a',

答案 1 :(得分:1)

[a-z],有效,但您在比赛中包含逗号。您可以使用\ze将其排除。

此替换适用于您的样本:

:s/\l\ze,/'&'/g
  • 匹配小写字符\l
  • 结束比赛,\ze
  • 替换为包含单引号的匹配'&'