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)で「i」を削除しようとすることです?-xism:

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 に答える