regex - Perl 正则表达式——使用 eval 进行动态替换,替换中使用文字 $1

标签 regex perl eval substitution

我正在使用 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/

相关文章:

regex - 如何使用正则表达式验证电子邮件地址?

javascript - jQuery 正则表达式 过滤数据

arrays - 使用 Perl 枚举哈希数组

python - 处理日志以修复格式错误的 IP 地址 ?.?.?.x

python - 字符串到数值数组

javascript - 为什么这个脚本标签在用于 document.write() 之前被拆分了?

java - 在正则表达式中没有正确获得 * 量词?

regex - 中间带有可变字符的负向后视正则表达式 (PERL)

perl - 如何使用 perl 触发在另一台机器上运行的另一个 perl 脚本?

python - 在 Python 中评估动态生成的语句