Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl将捕获组替换为捕获组的长度_Regex_Perl - Fatal编程技术网

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
是串联运算符。有关良好的教程和文档中的一般说明,请参见。没有太多,因为它只是把两个字符串加在一起。谢谢。我的错误是,我在文档中搜索了“连接”,但它是“连接”-皮蒂,我并没有猜到要搜索单词的开头!