我正在使用 eval 来处理动态替换正则表达式。
左侧的值捕获 ($1) 未在正则表达式的右侧使用。
#!/usr/bin/perl
use strict;
my $string = "test-txt";
# Attempt 1
my $regexp_m = '-(\S+)$';
my $regexp_r = '.$1';
my $string2 = eval{ $string =~ s/$regexp_m/$regexp_r/; return $string; };
# Attempt 2
my $regexp = 's/(\S+)$/.$1/';
my $string3 = eval{ $string =~ $regexp; return $string; return $string; };
print "Attempt 1: $string2\n";
print "Attempt 2: $string3\n";
exit;
输出:
尝试 1:测试。$1
尝试 2:测试。$1
最佳答案
正如 Daxim 评论的那样,this answer by Ysth包含一个解决方案。 Perl documentation说你可以使用 /ee
正则表达式修饰符来:
Evaluate the right side as a string then eval the result.
Ysth 将 '".$1"'
作为替换正则表达式的右侧传递。 /ee
修饰符首先将此字符串计算为 ".$1"
。之后,eval
将 $1
替换为第一个捕获组。
工作示例:
my $string = 'test-txt';
my $regexp_m = '-(\S+)$';
my $regexp_r = '".$1"'; # Note the double quotes, so it's a string in a string
$string =~ s/$regexp_m/$regexp_r/ee;
print "$string\n";
关于regex - Perl 正则表达式——使用 eval 进行动态替换,替换中使用文字 $1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17151534/