6

有没有一种简单的方法可以将 '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”

4

3 回答 3

6

你不能把标志放在qr你已经拥有的结果中,因为它是受保护的。相反,使用这个:

$pat = qr/F(o+)B(a+)r/i;
于 2011-11-10T16:32:30.867 回答
2

您可以修改现有的正则表达式,就像它是一个字符串一样,只要您之后重新编译它

  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
于 2011-11-11T11:29:32.800 回答
1

看起来唯一的方法是对 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:我也未能检查转义的左括号。

于 2011-11-11T11:32:30.890 回答