首页 > 解决方案 > 为什么在 vim 中任何字符都不匹配的正则表达式?

问题描述

我有一个正在用 vim 编辑的文件。我想删除_后跟一个数字的任何字符。这是我正在编辑的内容:

some,file_1,file_2,field
groupA_1,/path/to/file1,/path/to/file2,this
groupB_1,/path/to/file1b,/path/to/file2c,that
groupA_2,/path/to/file1,/path/to/file2,this
groupB_2,/path/to/file1b,/path/to/file2b,that

我正在使用%s/.\_\d//导致

some,file,file_2,field
groupA,/path/to/file1,/path/to/file2,this
groupB,/path/to/file1b,/path/to/file2c,that
groupA,/path/to/file1,/path/to/file2,this
groupB,/path/to/file1b,/path/to/file2b,that

请注意标题保留file_2,并且A保留B。这是我的预期结果:

some,file,file,field
group,/path/to/file1,/path/to/file2,this
group,/path/to/file1b,/path/to/file2c,that
group,/path/to/file1,/path/to/file2,this
group,/path/to/file1b,/path/to/file2b,that

标签: regexvim

解决方案


您的正则表达式的问题是:

  1. 您没有使用该g标志,因此仅删除每行的第一次出现
  2. \_\d匹配一个数字,\_被解释为一个特殊的结构,使下一个模式换行知道。所以,最终,你的模式就等于.\d

你想要的可以通过

%s/[[:upper:]]\?_\d//g

详情

  • [[:upper:]]\?- 一个可选的大写字母
  • _- 一个下划线
  • \d- 一个数字(用于\d\+匹配一个或多个数字)。

推荐阅读