如何在正则表达式中将$ 1与数字连接起来

时间:2012-08-01 15:28:52

标签: regex perl

我想在两种模式之间插入数字:

$s = 'id="" value="div"';
$s =~ s/(id=")(".*)/$1123$2/;

当然我得到了错误,结果是 “value =”div“ 。 预期结果为 id =“123”value =“div”

在替换中,我的意思是1美元,然后是123,然后是2美元,但不是1123美元,而是2美元。 正则表达式中正确的替换是什么?我想在一个正则表达式中完成。

感谢。

2 个答案:

答案 0 :(得分:16)

$s =~ s/(id=")(".*)/$1123$2/;  # Use of uninitialized value $1123 in concatenation (.) or string

虽然您希望它替代$1,但perl将其视为变量$1123。 Perl无法知道你的意思是$1。因此,您需要将变量限制为$1,方法是将其指定为${1}

$s =~ s/(id=")(".*)/${1}123$2/;

在脚本的顶部包含以下内容始终是个好主意。它们将为您节省大量时间和精力。

use strict;
use warnings;

例如,运行包含上述模块的脚本会导致错误消息:

Use of uninitialized value $1123 in concatenation (.) or string at /tmp/test.pl line 7.

(忽略报告的脚本名称和行号。)它清楚地说明了perl的预期。

使用look-behind和look-ahead断言的另一种方法:

$s =~ s/(?<=id=")(?=")/123/;

答案 1 :(得分:1)

另一种变体:

$s =~ s/(id=")(".*)/$1."123".$2/e;

用法示例:

$ cat 1.pl
$s = 'id="" value="div"';
$s =~ s/(id=")(".*)/$1."123".$2/e;
print $s,"\n";

$ perl 1.pl
id="123" value="div"