有没有一种简单的方法可以将 'i' 等正则表达式修饰符添加到引用的正则表达式中?例如:
$pat = qr/F(o+)B(a+)r/;
$newpat = $pat . 'i'; # This doesn't work
我能想到的唯一方法是print "$pat\n"
返回(?-xism:F(o+)B(a+)r)
并尝试?-xism:
用替换删除“i”
有没有一种简单的方法可以将 'i' 等正则表达式修饰符添加到引用的正则表达式中?例如:
$pat = qr/F(o+)B(a+)r/;
$newpat = $pat . 'i'; # This doesn't work
我能想到的唯一方法是print "$pat\n"
返回(?-xism:F(o+)B(a+)r)
并尝试?-xism:
用替换删除“i”
你不能把标志放在qr
你已经拥有的结果中,因为它是受保护的。相反,使用这个:
$pat = qr/F(o+)B(a+)r/i;
您可以修改现有的正则表达式,就像它是一个字符串一样,只要您之后重新编译它
my $pat = qr/F(o+)B(a+)r/;
print $pat, "\n";
print 'FOOBAR' =~ $pat ? "match\n" : "mismatch\n";
$pat =~ s/i//;
$pat = qr/(?i)$pat/;
print $pat, "\n";
print 'FOOBAR' =~ $pat ? "match\n" : "mismatch\n";
输出
(?-xism:F(o+)B(a+)r)
mismatch
(?-xism:(?i)(?-xsm:F(o+)B(a+)r))
match
看起来唯一的方法是对 RE 进行字符串化,将 (-i) 替换为 (i-) 并重新引用它:
my $pat = qr/F(o+)B(a+)r/;
my $str = "$pat";
$str =~ s/(?<!\\)(\(\?\w*)-([^i:]*)i([^i:]*):/$1i-$2$3:/g;
$pati = qr/$str/;
更新:perl 5.14 以不同的方式引用正则表达式,所以我的示例应该看起来像
my $pat = qr/F(o+)B(a+)r/;
my $str = "$pat";
$str =~ s/(?<!\\)\(\?\^/(?^i/g;
$pati = qr/$str/;
但我手头没有 perl 5.14,无法测试它。
UPD2:我也未能检查转义的左括号。