如何将perl regexp合并为一个组合匹配

时间:2016-05-13 09:07:17

标签: regex perl

我有一个Perl应用程序,可以输入两个正则表达式。

是否有可能将正则表达式合并为一个正则表达式,只有在满足两个正则表达式条件时才会发生匹配?

示例:

pattern1 = "^.*$"  
pattern2 = "^abc$"

结果应该是:"^abc$"

我知道有一个名为“Regexp :: Assemble”的模块,但只允许我以正则表达式创建匹配的方式组合正则表达式。

2 个答案:

答案 0 :(得分:3)

你不能将它们合并到一个正则表达式中 - 这比你想象的要复杂得多。 (在相对微不足道的案件之外)。 regex是一种编程语言,可以为你编写代码,这是一项非常重要的任务。

但是你可以很方便地测试多个正则表达式。

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

my @conditions = ( qr/^.*$/, qr/[A-Z]+/, qr/123/, );

LINE: while (<DATA>) {
    foreach my $regex (@conditions) {
        next LINE unless m/$regex/;
    }
    print;
}

__DATA__
shouldn't match, non number
1234567
test123
Test123

为了提高效率,您还可以订购正则表达式,以便最有可能首先失败。

答案 1 :(得分:1)

这是可能的,但有限制。您需要做的就是将其中一个模式包含在前瞻断言中,如下所示:

(?=pattern1)pattern2

即使模式具有内联修饰符((?i)或类似),这也应该有效,第一个模式的修饰符不应该延续到第二个模式。

我所知道的这个解决方案的唯一问题是反向引用(\1\2等)。如果pattern1中有捕获组,那么pattern2中的任何反向引用都将引用错误的组。例如:

pattern1 = "(a)b."
pattern2 = "a(b)\1"
text = "abb"

两种模式都匹配abb,但组合模式(?=(a)b.)a(b)\1只匹配aba