我有类似于下面显示的文本输入。我想在每个 'a=b' 模式之前添加单词 auto
,但前提是它是关键字 kywrd
之后的序列的一部分(用分号分隔)。
kywrd a=b;c=d;
e=f;
fnctn z;
g=h;
所以我在这里寻找的输出是:
kywrd2 auto a=b;auto c=d;
auto e=f;
fnctn z;
g=h;
下面的 Perl6 (Raku?) 代码使用正则表达式添加
auto
关键字,但仅在第一个 a=b
模式之前。是否有一种简单的方法可以对序列中的所有模式执行替换;保留 g=h;
不变?my Str $x = slurp "in.q";
$x ~~ s:g /kywrd\s+(\w+)\=(\w+)\;/kywrd2 auto $0=$1\;/;
spurt "out.q", $x;
最佳答案
将正则表达式保持在最低限度的一种可能方法:
sub repl ($input)
{
$input.Str
.split(';', :skip-empty)
.map( 'auto ' ~ * ~ ';')
.join('')
};
my $foo = 'kywrd a=b;c=d;d=e;';
$foo ~~ s:g /kywrd \s+ (.+)/kywrds2 { repl($0) }/;
$foo.say;
不过,我个人更喜欢
subst
形式的方法,而不是 s//
运算符。$foo .= subst(/ kywrd \s+ (.+) /, "kywrds2 { repl($0) }", :g);