假设你有一些看起来像这样的行
1 int some_function() {
2 int x = 3; // Some silly comment
等等。缩进是用空格完成的,每个缩进都是两个空格。
您希望将每个缩进更改为三个空格。简单的正则表达式
s/ {2}/ /g
不适合你,因为它会改变一些非缩进空格;在这种情况下,它将// Some silly comment
之前的两个空格更改为三个空格,这是不希望的。 (如果在行的后端对齐表或注释,则会变得更糟。)
你不能简单地使用
/^( {2})+/
因为什么会替换它?我不知道一个简单的方法来找出+
在正则表达式中匹配的次数,因此我们不知道要插入多少次更改的缩进。
你总是可以一行一行地切断缩进,测量它们,构建一个新的缩进字符串,然后将它固定在线上,但如果有一个正则表达式那就太简单了。
是否有正则表达式来替换上面描述的缩进级别?
答案 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个空格(或者在上述规则之后的前一场比赛)。
答案 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