【问题标题】:How to concatenate $1 with number in a regex如何在正则表达式中将 $1 与数字连接起来
【发布时间】:2012-08-01 15:28:51
【问题描述】:

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

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

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

在替换中,我指的是 1 美元,然后是数字 123,然后是 2 美元,但不是 1123 美元,然后是 2 美元。 正则表达式中的正确替换是什么?我想用一个正则表达式来做。

谢谢。

【问题讨论】:

    标签: regex perl


    【解决方案1】:
    $s =~ s/(id=")(".*)/$1123$2/;  # Use of uninitialized value $1123 in concatenation (.) or string
    

    虽然您希望它替换 $1,但 perl 将其视为变量 $1123。 Perl 无法知道您的意思是$1。因此,您需要将 variablisation 限制为 $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} 语法。
    • 我更喜欢前后观察
    • @justintime,奖励:带有环视的版本更快,因为它没有任何捕获。
    【解决方案2】:

    另一种变体:

    $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"
    

    【讨论】:

    • 这是一个错误的变体。结果将是 id="."1"." value="div"
    • 我添加了使用示例。如您所见,变体没有错
    猜你喜欢
    • 2021-02-19
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多