如何用perl中的新模式替换匹配的模式?

时间:2015-02-26 09:32:53

标签: regex perl

我正在尝试替换与以下模式匹配的字符串:

my $string ="+++details of candidate 
           ++name of candidate
           +age of candidate
             +++idiot
                 +idi";

该字符串应替换为:

       my $string ="hii 
            how
           fine
            hii
            fine";

我该如何做到这一点?

2 个答案:

答案 0 :(得分:2)

也许:

$string =~ s/(\++)([^\+\n]*)/(qw(fine how hii))[length($1)-1]/ge;

答案 1 :(得分:-2)

使用

$string =~ s/([^+]*)[+]+((\w+).*)([^ \r\n]*|$)/$1<div class="$3">$2<\/div>/g;
$string =~ s/ class="details"//g;

<强>解释

  • 搜索+ ...
  • 的序列
  • ...,除了+ ...
  • 之外的charcaters之前的副本
  • ...,在+序列后附加内容,将其包含在div标记中,其中class属性包含所述内容的第一个单词...
  • ...,内容结束的地方&#39;标有一系列的空格,换行或回车; ...
  • ...有效地为每一行重复这种替换,并对结果进行汇总;

  • 在第二次替换中,删除不需要的类属性(在这种情况下,&#39;详细信息&#39;)。

备注

  • &#39;详情&#39;可能会被不同地挑出来,例如。通过计算+个字符。
  • 还有其他可能的解决方案,特别是那些采用正则表达式等正则表达式引擎的高级功能的解决方案。

<强>买者

  • 考虑解决方案,因为它是概念证明:

    正则表达式中替换的上下文的规范关键取决于将应用正则表达式的上下文,即。反对它的潜在字符串集必须匹配。

    您提供的模式是一小组样本。从字面上看,模式恰好是您提供的字符串集。当然,正则表达式所表达的概括是我自己对模式的实际性质的假设。

<强>更新

OP更新了他的问题,并要求另外一个替代:

$string =~ s/[+]{3}((\w+).*)([^ \r\n]*|$)/hii/g;
$string =~ s/[+]{2}((\w+).*)([^ \r\n]*|$)/how/g;
$string =~ s/[+]{1}((\w+).*)([^ \r\n]*|$)/fine/g;

通过减少模式中+序列长度的顺序非常重要。