2011-06-30 18 views
6

Tengo lo que pensé que sería un problema fácil de resolver, pero no puedo encontrar la respuesta a esto.Perl buscar y reemplazar la última ocurrencia de caracteres

¿Cómo puedo encontrar y reemplazar la última aparición de un carácter en una cadena?

Tengo una cadena: GE1/0/1 y me gustaría que fuera: GE1/0: 1 < - Esto puede ser de longitud variable, por lo que no hay subcadenas.

Aclaración: Estoy buscando reemplazar el último/con un: no importa lo que ocurra antes o después.

Respuesta

11
use strict; 
use warnings; 
my $a = 'GE1/0/1'; 
(my $b = $a) =~ s{(.*)/}{$1:}xms; 
print "$b\n"; 

uso el comportamiento codicioso de .*

+0

Gracias, esto funcionó perfectamente. – shaneburgess

2

Esto encuentra una barra y mira hacia adelante para asegurarse de que no hay más barras pasado .:

expresiones regulares prima:

/(?=[^/]*$) 

Creo que el código sería algo como esto, pero perl no es mi lenguaje:

$string =~ s!/(?=[^/]*$)!\:!g; 
4

Tal vez no han de entender el problema con longitud variable, pero me gustaría hacer lo siguiente:

puede hacer coincidir lo que quiera con la expresión regular:

(.+)/ 

Por lo tanto, este script Perl

my $text = 'GE1/0/1'; 
$text =~ s|(.+)/|$1:|; 
print 'Result : '.$text; 

la salida:

Result : GE1/0:1 

El cuantificador '+' es 'codicioso' por defecto, coincidirá solo con el último carácter de barra.

Espero que esto sea lo que estabas preguntando.

1

"última aparición en una cadena" es ligeramente ambigua. La forma en que lo veo, puede significar:

"Foo: 123, yada: GE1/0/1, Bar: null" 

Significado de la última ocurrencia de la "palabra" GE1/0/1, o:

"GE1/0/1" 

Como cadena completa.

En este último caso, es un asunto bastante simple, solo tiene que decidir qué tan específico puede ser en su expresión regular.

$str =~ s{/(\d+)$}{:$1}; 

Está perfectamente bien, suponiendo que el último carácter (s) solo puede tener dígitos.

En el primer caso, que no creo que usted se refiere, pero voy a incluir todos modos, que había necesidad de ser mucho más específico:

$str =~ s{(\byada:\s+\w+/\w+)/(\w+\b)}{$1:$2}; 
Cuestiones relacionadas