2011-11-10 5 views
6

引用符付き正規表現に 'i'などの正規表現修飾子を追加する簡単な方法はありますか?たとえば:引用符付きの正規表現(qr)に修飾子を追加する方法

$pat = qr/F(o+)B(a+)r/; 
$newpat = $pat . 'i'; # This doesn't work 

私は考えることができる唯一の方法は、print "$pat\n"にあり、バック(?-xism:F(o+)B(a+)r)を取得し、「私は」あなたは結果内の旗を置くことができない置換

答えて

6

?-xism:でを削除しよう既に保護されているので、あなたが既に持っているqrです。代わりに、これを使用する:それは限り、あなたは後でそれを再コンパイルなどの文字列であるかのよう

$pat = qr/F(o+)B(a+)r/i; 
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 
+1

+1既存の正規表現に修飾語を植えるための適切な方法を示します。 '(?...)'部分はhttp://perldoc.perl.org/perlre.html#Extended-Patterns – daxim

+2

で文書化されています。正規表現の文字列が変更されたため、これはPerl 5.12以降では機能しません。 –

1

がどのように見えるOUTPUT唯一の方法は、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/; 

UPDATE:perlのdifferent wayで5.14引用符正規表現を、ので、私のサンプルは、おそらく

my $pat = qr/F(o+)B(a+)r/; 
my $str = "$pat"; 
$str =~ s/(?<!\\)\(\?\^/(?^i/g; 
$pati = qr/$str/; 

のようになります。しかし、私は手元にperlの5.14を持っていないし、それをテストすることはできません。

UPD2:エスケープされた開始括弧も確認できませんでした。

+0

正規表現の文字列化でPerl 5.14で-optionsが行われないため、これはもう動作しません。 –

+0

@briandfoy:ありがとうございます。私は自分の答えを更新しましたが、5.14の部分が動作するかどうかは分かりません。 – Dallaylaen

関連する問題