2011-06-30 9 views
6

Mam to, co uważałem za łatwy problem do rozwiązania, ale nie jestem w stanie znaleźć odpowiedzi na to pytanie.Perl wyszukuje i zastępuje ostatnie wystąpienie znaku

Jak mogę znaleźć i zastąpić ostatnie wystąpienie znaku w ciągu znaków?

Mam ciąg: GE1/0/1 i chciałbym, aby było: GE1/0: 1 < - Może to być zmienna długość, więc nie należy podciągać.

Wyjaśnienie: szukam zastąpić ostatni/z: bez względu na to, co jest przed lub po nim.

Odpowiedz

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

używam chciwy zachowanie .*

+0

Dziękuję, to działało idealnie. – shaneburgess

2

Znajduje ukośnik i patrzy w przyszłość, aby upewnić się, że nie ma więcej ukośniki minione nim .:

Raw regex:

/(?=[^/]*$) 

Myślę, że kod wyglądałby tak, ale perl nie jest moim językiem:

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

Może ja nie rozumiem problem ze zmienną długością, ale chciałbym wykonaj następujące czynności:

można dopasować, co chcesz z regex:

(.+)/ 

tak, to skrypt Perl

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

wyjście wola:

Result : GE1/0:1 

Kwantyfikator "+" jest domyślnie "chciwy", dopasuje tylko ostatni znak ukośny.

Mam nadzieję, że o to prosiliście.

1

"ostatnie wystąpienie w ciągu znaków" jest nieco niejednoznaczne. Tak jak ja to widzę, można rozumieć jako:

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

Znaczenie ostatnie wystąpienie w "słowie" Wn1/0/1 lub:

"GE1/0/1" 

jako kompletny ciąg.

W tym ostatnim przypadku jest to dość prosta sprawa, wystarczy zdecydować, jak konkretnie możesz być w swoim regex.

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

Jest całkowicie w porządku, zakładając, że ostatni znak (y) może być tylko cyframi.

W pierwszym przypadku, który nie sądzę masz na myśli, ale ja to tak, że trzeba być bardziej szczegółowe:

$str =~ s{(\byada:\s+\w+/\w+)/(\w+\b)}{$1:$2}; 
Powiązane problemy