我有一个Perl应用程序,可以输入两个正则表达式。
是否有可能将正则表达式合并为一个正则表达式,只有在满足两个正则表达式条件时才会发生匹配?
示例:
pattern1 = "^.*$"
pattern2 = "^abc$"
结果应该是:"^abc$"
我知道有一个名为“Regexp :: Assemble”的模块,但只允许我以正则表达式创建匹配的方式组合正则表达式。
答案 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
。