perl regex用于变量替换

时间:2018-04-24 20:18:11

标签: regex perl

我想替换标记为"#"的变量。并以点或非字母数字字符结束。 示例:变量#name应替换为" Peter"

abc#name.def => abcPeterdef
abc#namedef  => abc#namedef
abc#name-def => abcPeter-def

因此,如果变量以点终止,则替换它并删除点。它是否被任何非孤元字符终止,它也被替换。

我使用以下内容:

s/#name\./Peter/i
s/#name(\W)/Peter$1/i

这有效但是可以将它合并到一个表达式中吗?

3 个答案:

答案 0 :(得分:3)

有几种可能的方法。

s/#name(\W)/"Peter" . ($1 eq "." ? "" : $1)/e

这里我们使用/e将替换部分转换为表达式,因此我们可以检查$1并动态选择替换字符串。

s/#name(?|\.()|([^.\w]))/Peter$1/

我们使用(?| )重置分支之间捕获组的编号,因此\.()([^.\w])都设置为$1。如果匹配.$1将成为空字符串;否则它包含匹配的字符。

答案 1 :(得分:2)

您可以使用

s/#name(?|\.()|(\W))/Peter$1/i

<强>详情

  • #name - 匹配文字子字符串
  • (?|\.()|(\W)) - branch reset group匹配两种选择中的任何一种:
    • \.() - 一个点,然后将空字符串捕获到$1
    • | - 或
    • (\W) - 捕获到$1的任何非单词字符。

因此,在匹配时,$1占位符为空或包含除点之外的任何非单词字符。

答案 2 :(得分:0)

您可以使用字面点或字边界作为终结符来执行此操作

喜欢这个

s/#name(?:\.|\b)/Peter/i

这是一个完整的程序,可以重现问题中显示的所需输出

use strict;
use warnings 'all';

for my $s ( 'abc#name.def', 'abc#namedef', 'abc#name-def' ) {

    ( my $s2 = $s ) =~ s/#name(?:\.|\b)/Peter/i;

    printf "%-12s => %-s\n", $s, $s2;
}

输出

abc#name.def => abcPeterdef
abc#namedef  => abc#namedef
abc#name-def => abcPeter-def