这是我的榜样。如果我想使用正则表达式用代码替换代码中的制表符,但想要在代码行的中间或末尾保留制表符,我会使用它作为我的搜索字符串来捕获每个制表符的开头。一行:^(\t)+
现在,我怎样才能编写一个搜索字符串,用四个空格替换每个捕获的组?我认为必须有一些方法可以通过反向引用来做到这一点?
我发现我可以通过多次运行类似的正则表达式替换(例如s/^\t/ /g
,s/^ \t/ /g
,...)来解决此问题,直到找不到更多匹配项,但我想知道如果有更快的方法可以立即完成所有必要的替换。
注意:我在我的示例中使用了sed
格式,但我不确定sed
是否可以这样做。我想知道sed
是否支持这个,如果没有,是否有一个平台可以做到? (例如,有一个支持这个的Python / Java / bash扩展正则表达式lib。)
答案 0 :(得分:2)
使用支持此功能的perl和其他语言(Java,PCRE(PHP,R,libboost),Ruby,Python(新的正则表达式模块),.NET),您可以使用{ {1}}锚点匹配最后一个匹配或字符串开头后的位置:
\G
答案 1 :(得分:1)
这适用于Perl。也许也是sed,我不知道sed
它依赖于做一个eval,基本上是一个回调
多次花费1美元,然后是猫' '
。
Perl样本。
my $str = "
\t\t\tThree
\t\tTwo
\tOne
None";
$str =~ s/^(\t+)/ ' ' x length($1) /emg;
print "$str\n";
输出
Three
Two
One
None
答案 2 :(得分:0)
答案 3 :(得分:0)
sed ':a
s/^\(\t*\)\t/\1 /
ta' YourFile
使用sed对1个正则表达式执行递归操作,这是一种解决方法