捕获perl中两个不同正则表达式的匹配内容

时间:2013-09-02 18:06:52

标签: regex perl

我正在使用带有两个单独正则表达式的while循环

while(($string1=~m/(\d+)/igs)==($string2=~m/([^^]*?)\n+/igs)) {}

存储我使用$temp1=$1

的$ string1的匹配模式的值

如何存储$string2的匹配模式。请给出一些建议。

3 个答案:

答案 0 :(得分:5)

my ($m1,$m2);
while (do{
  ($m1,$m2) = ();
  $m1 = $1 if $string1 =~ /(\d+)/igs;
  $m2 = $1 if $string2 =~ /([^^]*?)\n+/igs;
  defined $m1 == defined $m2;
}) {
  # print "$m1-$m2-\n";
}

答案 1 :(得分:3)

可能有更聪明的方法,但我只是把它们分成单独的陈述:

while (1) {
    $res1 = $string1=~m/(\d+)/igs;
    $temp1 = $1;
    $res2 = $string2=~m/([^^]*?)\n+/igs
    $temp2 = $1;
    last unless $res1 == $res2;
    ...
}

仅仅因为它是perl你没有拥有来找到最简洁,最神秘的写东西的方式(这就是APL的用途)。

答案 2 :(得分:0)

如果你的任务并不真正需要“g”和“s”选项而你实际上只想比较第一个匹配的子串,你可以按如下方式进行单行测试:

if (($a =~ /regex1/)[0] == ($b =~ regex2/)[0]) {
    ...

如果您需要知道两个匹配的字符串是什么,只需添加一些临时变量来保存它们:

if (($first = ($a =~ /regex1/)[0]) == ($second = ($b =~ regex2/)[0])) {
    ...

但是如果你真的想要比较每个字符串中的所有连续匹配以查看每​​对是否相等,那么我认为没有单一语句解决方案可以做到这一点。你的正则表达式都返回一个列表,“==”只比较它们的长度。你必须使用上面提出的第一个解决方案并在“long-hand”中写出比较代码。

上面的第二个解决方案不起作用,因为它将继续测试每个字符串中的第一个匹配。

有点难以理解你想要做什么,但你至少可以在/(\ d +)/的第一次测试中删除“i”选项。据推测,只有第二个字符串需要“s”选项,因为您正在寻找嵌入式新行。