2011-11-10 20 views
6

C'è un modo semplice per aggiungere modificatori di espressioni regolari come "i" a un'espressione regolare quotata? Per esempio:Come aggiungere un modificatore a un'espressione quotata regolare (qr)

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

L'unico modo che posso pensare è quello di print "$pat\n" e tornare (?-xism:F(o+)B(a+)r) e cercare di rimuovere la 'i' in ?-xism: con una sostituzione

risposta

6

Non si può mettere il flag all'interno del risultato di qr che hai già, perché è protetto. Invece, utilizzare questo:

$pat = qr/F(o+)B(a+)r/i; 
2

È possibile modificare un espressione regolare esistente come se fosse una stringa fino a quando si ricompilate dopo

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"; 

USCITA

(?-xism:F(o+)B(a+)r) 
    mismatch 
    (?-xism:(?i)(?-xsm:F(o+)B(a+)r)) 
    match 
+1

+1 per mostrare il modo appropriato di inserire un modificatore in un'espressione regolare esistente. La parte '(? ...)' è documentata in http://perldoc.perl.org/perlre.html#Extended-Patterns – daxim

+2

Questo non funziona dopo Perl 5.12 perché la rigidezza delle espressioni regolari è cambiata. –

1

Sembra l'unico modo è quello di stringificare il RE, sostituire (-i) con (i-) e ri-quotarlo indietro:

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 5.14 citazioni espressioni regolari in un different way, quindi il mio campione dovrebbe probabilmente essere simile

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

Ma non ho perl 5.14 a portata di mano e non può testarlo.

UPD2: Ho anche omesso di verificare la parentesi aperta di escape.

+0

Questo non funzionerà più perché la rigificazione delle espressioni regolari non fa -options in Perl 5.14. –

+0

@briandfoy: Grazie per avermi tirato fuori. Ho aggiornato la mia risposta, ma non sono sicuro che la parte 5.14 funzioni. – Dallaylaen