如何在vim中编写分组和替换规则?

时间:2016-03-04 11:35:58

标签: regex vim

我想用2替换3个whitte空格,也就是说将text1更改为text2。

的text1

   test1
   test2
      test3

text2的

  test1
  test2
      test3

我的意思是:第一组是三个白色空白,它将匹配并替换为两个白色空白;第二组保持不变。

可能是%s///g

的形式

1.什么是正确的正则表达式?

%s/^\(\s\{3\}\)\w\+/\1  /g

2.为什么\s\{2\}\s\{2}不能代表两个白色空白?

2 个答案:

答案 0 :(得分:1)

您实际上可以使用

%s/^\s\{3}\(\w\+\)/  \1/g

或使用" lookahead":

%s/^\s\{3}\(\w\+\)\@=/  /g

请注意,\s\{2}实际上匹配2个空格,如果在正则表达式模式部分中使用的话。它不能用于替换模式(/g之前的模式),因为它需要文字和反向引用(如\1)。

此外,没有必要逃避限制量词}中的结束\{3},因为Vim足够聪明地理解}属于量词构造,而不是文字}

更新:如果要将空格与行上的任何非空白字符匹配,请使用\S速记字符类而不是\w赢得'匹配.,

%s/^\s\{3}\(\S\+\)/  \1/g

答案 1 :(得分:1)

对不起,我无法发表评论。我更喜欢这里的负面预测:

%s/^ \{3\} \@!/  /g

我也不确定,如果你只想匹配空白或任何类型的白色空白。

%s/^\s\{3\} \@!/  /g