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

时间:2012-10-09 20:34:23

标签: regex

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

1  int some_function() {
2    int x = 3;  // Some silly comment

等等。缩进是用空格完成的,每个缩进都是两个空格。

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

s/ {2}/   /g

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

你不能简单地使用

/^( {2})+/

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

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

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

4 个答案:

答案 0 :(得分:8)

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

s/(?<=^ *)  /   /g

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

 s/  (?= *$)/   /g

答案 1 :(得分:5)

这是另一个,而是使用\G,其中包含 NET,PCRE(C,PHP,R ...),Java,Perl和Ruby支持

s/(^|\G) {2}/   /g
  

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

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

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

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

答案 2 :(得分:5)

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

//search for
^( +)\1 
//replace with (or \1, in some programs, like geany)
$1 

来自source:&#34; ^( +)\1表示&#34;行开头的任何非零长度空格序列,后跟相同的空格序列。模式中的\1和替换中的$1都是对初始空间序列的反向引用。结果:缩进减半。&#34;

答案 3 :(得分:0)

你可以试试这个:

^(\s{2})|((?<=\n(\s)+))(\s{2})

故障:

^(\s{2})  = Searches for two spaces at the beginning of the line
((?<=\n(\s)+))(\s{2}) = Searches for two spaces
    but only if a new line followed by any number of spaces is in front of it.
    (This prevents two spaces within the line being replaced)

我对perl并不完全熟悉,但我会试着看看它是否有效:

s/^(\s{2})|((?<=\n(\s)+))(\s{2})/\s\s\s/g

正如@Jan所指出的那样,可能还有其他非空格的空白字符。如果这是一个问题,请尝试:

s/^( {2})|((?<=\n( )+))( {2})/   /g