2011-04-21 21 views
6

Tengo una expresión regular que reemplaza todos los caracteres especiales con% (para buscar en la base de datos con LIKE). Se ve así:Expresión regular de Perl: cómo reemplazar todo el carácter deseado excepto el primero

$string =~ s/[^ a-zA-Z0-9]/%/g; 

Sin embargo no sé cómo cambiar esa expresión para reemplazar todos los caracteres especiales deseados a excepción de la primera de una cadena. Así que si mi cadena parezca

"&Hi I'm smart(yeah right...)" 

sería

"&Hi I%m smart%yeah right%%%%" 

(En este momento el primer '& también se sustituye).

¿Alguien puede ayudar?

Respuesta

3

Esto cambia todo pero la primera instancia de la diana partido en un símbolo de porcentaje:

{ 
    my $count = 0; 
    $string =~ s{([^ a-zA-Z0-9])}{$count++ ? "%" : $1}ge; 
} 
3

Se puede usar un look-behind assertion que requiere por lo menos un carácter:

s/(?<=.)[^ a-zA-Z0-9]/%/g; 
+0

+1 bueno "mirar detrás". – Prix

+1

Eso solo funciona si el primer caracter es un caracter especial. No funciona para cambiar todos menos el primero de esos caracteres especiales en el caso general. – tchrist

2
substr($string, 1) =~ s/[^ a-zA-Z0-9]/%/g; 

actualización: Lo anterior sólo funciona si el carácter especial es el primer carácter de la cadena. Las siguientes obras sin importar dónde se encuentra:

my $re = qr/[^ a-zA-Z0-9]/; 
my @parts = split(/($re)/, $string, 2); 
$parts[2] =~ s/$re/%/g if @parts == 3; 
$string = join('', @parts); 
+0

Pero, ¿y si el primer "personaje especial" no es el primer personaje? – tchrist

+0

@tchrist, entonces esa sería una pregunta diferente con una respuesta diferente. – ikegami

+0

@tchrist, o tal vez no. Después de volver a leer algunas veces más, estoy contigo. – ikegami

Cuestiones relacionadas