正则表达式更改缩进级别中的空格数

So8*_*res 16 regex

假设你有一些看起来像这样的线条

1  int some_function() {
2    int x = 3;  // Some silly comment
Run Code Online (Sandbox Code Playgroud)

等等.缩进用空格完成,每个缩进是两个空格.

您希望将每个缩进更改为三个空格.简单的正则表达式

s/ {2}/   /g
Run Code Online (Sandbox Code Playgroud)

不适合你,因为这会改变一些非缩进空格; 在这种情况下,它将两个空格改变// Some silly comment为三个空格,这是不希望的.(如果在行的后端对齐表或注释,则会变得更糟.)

你不能简单地使用

/^( {2})+/
Run Code Online (Sandbox Code Playgroud)

因为什么会替换它?我不知道一个简单的方法来找出+在正则表达式中匹配的次数,因此我们不知道要插入多少次更改的缩进.

你总是可以一行一行地切断缩进,测量它们,构建一个新的缩进字符串,然后将它固定在线上,但是如果有一个正则表达式那就太简单了哦.

是否有正则表达式来替换上面描述的缩进级别?

Joh*_*rak 10

在一些正则表达式中,您可以使用lookbehind:

s/(?<=^ *)  /   /g
Run Code Online (Sandbox Code Playgroud)

在所有其他风格中,您可以反转字符串,使用前瞻(所有风格支持)并再次反转:

 s/  (?= *$)/   /g
Run Code Online (Sandbox Code Playgroud)

  • 据我所知,无限长度的lookbehind只能在.NET中工作,但在那里它会工作。+1 不错的解决方案。 (2认同)
  • 奇迹般有效.谢谢!(@stema,vimscript也有:D) (2认同)

oha*_*aal 6

这里的一个又一个,而不是利用\G其具有NET,PCRE(C,PHP,R ...),Java和Perl和Ruby的支持:

s/(^|\G) {2}/   /g
Run Code Online (Sandbox Code Playgroud)

\G[...]可以在以下两个位置之一匹配:
✽字符串的开头
,immediately紧接上一个匹配结束的位置.

资料来源:http://www.rexegg.com/regex-anchors.html#G

我们利用它的能力匹配紧接在前一个匹配结束之后的位置,在这种情况下将在一行的开头,然后是2个空格(或者在上述规则之后的前一个匹配).

请参阅示例:https://regex101.com/r/qY6dS0/1


Jul*_*che 6

我需要将缩进空间减少一半。也就是说,如果缩进为4个空格,则需要将其更改为2个空格。我无法提出正则表达式。但是,值得庆幸的是,其他人做到了:

//search for
^( +)\1 
//replace with (or \1, in some programs, like geany)
$1 
Run Code Online (Sandbox Code Playgroud)

来自:“ ^( +)\1表示”行首的任何非零长度的空格序列,后跟相同的空格序列。的\1图案中的,并且$1在替换,都是空格的初始序列的两个反向引用。结果:缩进减半。”