perl模式逐个匹配并处理它

时间:2011-10-05 05:36:47

标签: perl pattern-matching substitution

我有一个字符串

[something]text1[/something] blah blah [something]text2[/something]

我需要编写一个Perl脚本来读取[something]标记中的内容,将其处理为“text-x”,然后将其放回[otherthing]标记。所以上面的字符串应该是

[otherthing]text-1[/otherthing] blah blah [otherthing]text-2[/otherthing]

将“textx”处理为“text-x”不是一个步骤。

所以这是我迄今为止的解决方案:

m/[something](?<text>.*)[/something]/

这会在中间输入字符串,我可以将其处理为“text-x”,但如何将其放回[otherthing]text-x[/otherthing]的同一位置?

  1. 在这种情况下如何使用s ///?
  2. 如何逐一完成整个字符串?

3 个答案:

答案 0 :(得分:2)

您可以使用/e上的s///开关在使用结果作为替换之前评估右侧,并使用/g标志为每次匹配执行此操作。

这是一个简单的例子:

use 5.12.0;

my $str = ">1<  >2<  >34<";

$str =~ s/>(\d+)</">>".process("$1")."<<"/eg;

say $str;

sub process {
    return "x" x $_[0];
}

答案 1 :(得分:1)

这应该接近了。它使用/ e修饰符允许您在正则表达式的替换方面进行处理,因此它调用fix_textx函数,您可以在其中执行多个步骤。

迭代匹配的常规方法是使用/ g修饰符。

#!/usr/bin/perl
use strict;
use warnings;

my $string = '[something]text1[/something] blah blah [something]text2[/something]';

$string =~ s{\[something\](text[^[]*)\[\/something\]}
            {'[otherthing]' . fix_textx($1) . '[/otherthing]'}ge;

print $string;

sub fix_textx {
    my ($testx) = @_;
    $testx =~ s/text\K(.*)/-$1/;
    return $testx;
}

编辑:修正了方括号。谢谢@tadmc

答案 2 :(得分:0)

在这种特殊情况下,您可以通过在"[something]"上拆分字符串然后处理每个部分的开头(第一个除外)来完成您要执行的操作,然后将这些部分重新组合在一起你已经完成了。

我不知道是否有一种通用的方法来迭代Perl中字符串中的正则表达式匹配。我希望其他人能回答这个问题并教育我。