2011-11-10 42 views
6

¿Hay alguna manera fácil de agregar modificadores de expresiones regulares como 'i' a una expresión regular entrecomillada? Por ejemplo:Cómo agregar un modificador a una expresión regular citada (qr)

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

La única manera que puedo pensar es que print "$pat\n" y volver (?-xism:F(o+)B(a+)r) y tratar de eliminar la 'i' en ?-xism: con una sustitución

Respuesta

6

No se puede poner la bandera en el interior del resultado de qr que ya tiene, porque está protegido. En su lugar, utilice la siguiente:

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

puede modificar una expresión regular existente como si se tratara de una cadena, siempre y cuando vuelve a compilar ello después

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

SALIDA

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

+1 para mostrar la forma adecuada de colocar un modificador en una expresión regular existente. La parte '(? ...)' está documentada en http://perldoc.perl.org/perlre.html#Extended-Patterns – daxim

+2

Esto no funciona después de Perl 5.12 porque la cadena de expresiones regulares ha cambiado. –

1

Parece la única forma es escribir el RE, reemplazar (-i) con (i-) y volver a citarlo:

my $pat = qr/F(o+)B(a+)r/; 
my $str = "$pat"; 
$str =~ s/(?<!\\)(\(\?\w*)-([^i:]*)i([^i:]*):/$1i-$2$3:/g; 
$pati = qr/$str/; 

ACTUALIZACIÓN: Perl 5.14 citas expresiones regulares en un different way, por lo que mi muestra, probablemente, debe ser similar

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

Pero no tengo Perl 5.14 a la mano y no puede probarlo.

UPD2: Tampoco compruebe el paréntesis de apertura escapado.

+0

Esto ya no funcionará porque la stringificación de expresiones regulares no funciona -opciones en Perl 5.14. –

+0

@briandfoy: Gracias por apuntar. He actualizado mi respuesta, pero no estoy seguro de que la parte 5.14 funcione. – Dallaylaen

Cuestiones relacionadas