是否有一个正则表达式引擎支持替换字符串中的“每个捕获的组”?

时间:2014-09-23 19:26:38

标签: regex sed backreference

这是我的榜样。如果我想使用正则表达式用代码替换代码中的制表符,但想要在代码行的中间或末尾保留制表符,我会使用它作为我的搜索字符串来捕获每个制表符的开头。一行:^(\t)+

现在,我怎样才能编写一个搜索字符串,用四个空格替换每个捕获的组?我认为必须有一些方法可以通过反向引用来做到这一点?

我发现我可以通过多次运行类似的正则表达式替换(例如s/^\t/ /gs/^ \t/ /g,...)来解决此问题,直到找不到更多匹配项,但我想知道如果有更快的方法可以立即完成所有必要的替换。

注意:我在我的示例中使用了sed格式,但我不确定sed是否可以这样做。我想知道sed是否支持这个,如果没有,是否有一个平台可以做到? (例如,有一个支持这个的Python / Java / bash扩展正则表达式lib。)

4 个答案:

答案 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)

只是另一个想法,我也可以用positive lookbehind来解决这个问题:

s/(?<=^[\t]*)\t/    /gm

这很难看,但确实有效。

答案 3 :(得分:0)

sed ':a
   s/^\(\t*\)\t/\1    /
   ta' YourFile

使用sed对1个正则表达式执行递归操作,这是一种解决方法