“如果你能想到的话,有一个 CPAN 模块可以做到这一点”。这就像 Perl 的第 34 条规则。
所以实际上存在Regexp::Compare,给定两个正则表达式字符串可以(有时)决定一个正则表达式是否匹配另一个正则表达式的真实子集。请注意,为了实现这一点,我在一开始就锚定了您的输入正则表达式。如果可以匹配所有匹配的字符串,则is_less_or_equal
返回 true 。$metarx
$rx
use strict; use warnings; use 5.010;
use Regexp::Compare qw(is_less_or_equal);
my @rx = (
'p(1|2)proxy-[1-4].domain.lan',
'p1smtp-[1-2].domain.lan',
'p[12]what-not-[1-8].domain.lan',
'q(1|2)proxy-[1-4].domain.lan',
'q(1|2)smtp-[1-2].domain.lan',
'q(1|2)what-not-[1-8].domain.lan',
);
my $metarx = '^p[12]';
for my $rx (@rx) {
say "/$metarx/ ≥ /^$rx/ ?\t", is_less_or_equal("^$rx", $metarx) ? "yes" : "no";
}
输出:
/^p[12]/ ≥ /^p(1|2)proxy-[1-4].domain.lan/ ? yes
/^p[12]/ ≥ /^p1smtp-[1-2].domain.lan/ ? yes
/^p[12]/ ≥ /^p[12]what-not-[1-8].domain.lan/ ? yes
/^p[12]/ ≥ /^q(1|2)proxy-[1-4].domain.lan/ ? no
/^p[12]/ ≥ /^q(1|2)smtp-[1-2].domain.lan/ ? no
/^p[12]/ ≥ /^q(1|2)what-not-[1-8].domain.lan/ ? no
我相信这符合您的想法。(注意:不要使用正则表达式对象,而只是使用普通字符串——这个模块可能在某些字符串化方面有困难)