2011-06-30 46 views
6

Tôi có những gì tôi nghĩ sẽ là một vấn đề dễ giải quyết nhưng tôi không thể tìm ra câu trả lời cho điều này.Tìm kiếm Perl và thay thế sự xuất hiện ký tự cuối cùng

Làm cách nào để tìm và thay thế lần xuất hiện cuối cùng của một ký tự trong chuỗi?

Tôi có một chuỗi: GE1/0/1 và tôi muốn nó là: GE1/0: 1 < - Đây có thể là độ dài thay đổi để không có chất nền.

Làm rõ: Tôi đang tìm cách thay thế cuối cùng/bằng: không có vấn đề gì xảy ra trước hoặc sau nó.

Trả lời

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

tôi sử dụng các hành vi tham lam của .*

+0

Cảm ơn bạn, điều này đã làm việc một cách hoàn hảo. – shaneburgess

2

này tìm thấy một dấu gạch chéo và trông về phía trước để chắc chắn rằng không có nhiều dấu gạch chéo qua nó .:

Raw regex:

/(?=[^/]*$) 

Tôi nghĩ mã sẽ trông giống như thế này, nhưng perl không phải là ngôn ngữ của tôi:

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

Có lẽ tôi đã không hiểu được vấn đề với độ dài thay đổi, nhưng tôi sẽ làm như sau:

Bạn có thể phù hợp với những gì bạn muốn với regex:

(.+)/ 

Vì vậy, kịch bản này Perl

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

chí đầu ra:

Result : GE1/0:1 

Định lượng '+' là 'tham lam' theo mặc định, nó sẽ chỉ khớp với ký tự gạch chéo cuối cùng.

Hy vọng đây là những gì bạn đang hỏi.

1

"lần xuất hiện cuối cùng trong chuỗi" hơi mơ hồ. Con đường tôi nhìn thấy nó, bạn có thể có nghĩa là một trong hai:

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

Ý nghĩa sự xuất hiện cuối cùng trong "chữ" GE1/0/1, hoặc:

"GE1/0/1" 

Là một chuỗi hoàn chỉnh.

Trong trường hợp sau, đó là vấn đề khá đơn giản, bạn chỉ phải quyết định mức độ cụ thể của bạn trong regex.

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

Hoàn toàn ổn, giả sử (các) ký tự cuối cùng chỉ có thể là chữ số.

Trong trường hợp thứ nhất, mà tôi không nghĩ rằng bạn đang đề cập đến, nhưng tôi sẽ bao gồm dù sao, bạn sẽ cần phải được nhiều hơn nữa cụ thể:

$str =~ s{(\byada:\s+\w+/\w+)/(\w+\b)}{$1:$2}; 
Các vấn đề liên quan