Regex Perl将捕获组替换为捕获组的长度
鉴于:Regex Perl将捕获组替换为捕获组的长度,regex,perl,Regex,Perl,鉴于: my $str = "foo95285734776bar"; $str =~ s/([0-9]{2,4})/_????_/g; 哪一个长度为1美元的正则表达式可以生成输出“foo_4_4_3_bar” 也就是说,其中“9528”替换为“_4”,5734替换为“_4”,其余的“776”替换为“_3”。您可以使用将Perl代码添加到替换部分,然后对替换部分进行求值 my $str = "foo95285734776bar"; $str =~ s/([0-9]{2,4})/'_' . l
my $str = "foo95285734776bar";
$str =~ s/([0-9]{2,4})/_????_/g;
哪一个长度为1美元的正则表达式可以生成输出“foo_4_4_3_bar”
也就是说,其中“9528”替换为“_4”,5734替换为“_4”,其余的“776”替换为“_3”。您可以使用将Perl代码添加到替换部分,然后对替换部分进行求值
my $str = "foo95285734776bar";
$str =~ s/([0-9]{2,4})/'_' . length($1) . '_'/ge;
print $str;
将输出
foo_4__4__3_bar
注意,您现在需要一个完整的Perl表达式。这就是为什么你必须引用并连接下划线
发件人:
A/e
将导致替换部分被视为一个完整的Perl表达式,并立即进行计算。然而,它是在编译时进行语法检查的。第二个e修饰符将导致替换部分在作为Perl表达式运行之前被求值
可以使用将Perl代码添加到替换部分,然后对替换部分求值
my $str = "foo95285734776bar";
$str =~ s/([0-9]{2,4})/'_' . length($1) . '_'/ge;
print $str;
将输出
foo_4__4__3_bar
注意,您现在需要一个完整的Perl表达式。这就是为什么你必须引用并连接下划线
发件人:
A/e
将导致替换部分被视为一个完整的Perl表达式,并立即进行计算。然而,它是在编译时进行语法检查的。第二个e修饰符将导致替换部分在作为Perl表达式运行之前被求值
干净利落,谢谢!将接受答案,除非有人能提供非求值方法。@但请注意,这实际上不是字符串求值。它是Perl正则表达式引擎的常规内置功能。参见
perl-MO=concrete-e'my$str=“foo9528574776bar”$str=~s/([0-9]{2,4})/“。长度(1美元)。“_uge;”代码>查看我的更新和更多文档。这是一个不错的eval
@robut,此解决方案不涉及eval
(与/ee
不同)/e
将源文件视为代码(而不是某个变量的值),因此不存在安全问题。任何可以更改源文件的人都可以让脚本执行任何操作。例如,s{foo}{bar}g
相当于s{foo}{qq{bar}}eg
;两者都在替换时计算双引号字符串。@AlexeiMartianov
是串联运算符。有关良好的教程和文档中的一般说明,请参见。没有太多,因为它只是把两个字符串加在一起。谢谢。我的错误是,我在文档中搜索了“连接”,但它是“连接”-皮蒂,我并没有猜到要搜索单词的开头!干净利落,谢谢!将接受答案,除非有人能提供非求值方法。@但请注意,这实际上不是字符串求值。它是Perl正则表达式引擎的常规内置功能。参见perl-MO=concrete-e'my$str=“foo9528574776bar”$str=~s/([0-9]{2,4})/“。长度(1美元)。“_uge;”代码>查看我的更新和更多文档。这是一个不错的eval
@robut,此解决方案不涉及eval
(与/ee
不同)/e
将源文件视为代码(而不是某个变量的值),因此不存在安全问题。任何可以更改源文件的人都可以让脚本执行任何操作。例如,s{foo}{bar}g
相当于s{foo}{qq{bar}}eg
;两者都在替换时计算双引号字符串。@AlexeiMartianov
是串联运算符。有关良好的教程和文档中的一般说明,请参见。没有太多,因为它只是把两个字符串加在一起。谢谢。我的错误是,我在文档中搜索了“连接”,但它是“连接”-皮蒂,我并没有猜到要搜索单词的开头!