2011-11-10 4 views
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)을 얻을 제거하려고 할 수있는 유일한 방법 '내가'당신의 결과 내부 플래그를 넣을 수 없습니다

답변

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 기존 정규 표현식에 수식어를 적용하는 적절한 방법을 보여주기 위해 +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 : 내 샘플 아마

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

과 같아야하지만 펄 5.14 손이없는 및 테스트 할 수 있도록하는 different way에서 5.14 따옴표으로 정규 표현식을 펄.

UPD2 : 이스케이프 처리 된 여는 괄호를 확인하지 못했습니다.

+0

regex stringification이 Perl 5.14에서 -options를 수행하지 않기 때문에 더 이상 작동하지 않습니다. –

+0

@briandfoy : 감사합니다. 내 대답을 업데이트했지만 5.14가 작동하는지 확신 할 수 없습니다. – Dallaylaen

관련 문제