2011-06-08 24 views
7

Nếu bạn có một regex đơn giản thay thế trong perl như sau:Perl regex thay thế trong cùng một trường hợp

($line =~ s/JAM/AAA/g){ 

thế nào tôi sẽ sửa đổi nó để nó nhìn vào trận đấu và làm cho việc thay thế các trường hợp tương tự như trận đấu ví dụ:

'JAM' sẽ trở thành 'AAA' và 'mứt' sẽ trở thành 'aaa'

+1

Làm điều đó hai lần : một lần cho 'JAM' và một lần cho 'jam'. – cnicutar

+0

Điều gì sẽ xảy ra với 'Jam'? –

+0

@ tim-pietzcker: Tôi gues nó nên trở thành 'Aaa' – MarcoS

Trả lời

1
$line =~ s/JAM/{$& eq 'jam' ? 'aaa' : 'AAA'}/gie; 
+1

Điều này không xử lý 'Jam' ->' Aaa' – MarcoS

+2

Ngoài ra nó là kinda vô nghĩa để sử dụng regex nếu bạn sau đó so sánh với chuỗi cố định ... – Tomalak

+0

Tuyệt vời! thats it :) về cơ bản giống như một câu lệnh if bên trong {}? –

2

Cái gì đó như có lẽ đây?

http://perldoc.perl.org/perlfaq6.html#How-do-I-substitute-case-insensitively-on-the-LHS-while-preserving-case-on-the-RHS%3f

Làm nó trong hai bước có lẽ a/ý tưởng đơn giản tốt hơn ...

Sử dụng sức mạnh của google tôi thấy this

The :samecase modifier, short :ii (since it's a variant of :i) preserve case. 

    my $x = 'Abcd'; 
    $x ~~ s:ii/^../foo/; 
    say $x;      # Foocd 
    $x = 'ABC' 
    $x ~~ s:ii/^../foo/; 
    say $x      # FOO 

This is very useful if you want to globally rename your module Foo, to Bar, 
but for example in environment variables it is written as all uppercase. 
With the :ii modifier the case is automatically preserved. 
+0

Bạn đã nhận thấy rằng ví dụ cuối cùng là Perl 6, phải không? – hobbs

+0

Bây giờ bạn đề cập đến nó, tôi làm :-) –

4

Unicode-based giải pháp:

use Unicode::UCD qw(charinfo); 
my %category_mapping = (
    Lu # upper-case Letter 
     => 'A', 
    Ll # lower-case Letter 
     => 'a', 
); 

join q(), map { $category_mapping{charinfo(ord $_)->{category}} } split //, 'jam'; 
# returns aaa 

join q(), map { $category_mapping{charinfo(ord $_)->{category}} } split //, 'JAM'; 
# returns AAA 

Ở đây, các ký tự chưa được phân loại resp. danh mục của họ dễ nhìn hơn một chút so với các câu trả lời khác.

3

Trong Perl 5 bạn có thể làm một cái gì đó như:

$line =~ s/JAM/$_=$&; tr!A-Z!A!; tr!a-z!a!; $_/gie; 

Nó xử lý tất cả các trường hợp khác nhau của JAM, như Jam, và thật dễ dàng để thêm Nói cách khác, ví dụ:

$line =~ s/JAM|SPAM/$_=$&; tr!A-Z!A!; tr!a-z!a!; $_/gie; 
+0

Cho chúng tôi biết cách xử lý các mục tiêu không thống nhất (ví dụ: 's/jam/stuck/') sẽ thú vị hơn làm thế nào để xử lý nhiều nguồn (Hoặc có lẽ để làm cho nó dễ dàng hơn,' s/jam/mit/') –

+0

Tôi tò mò - trong những ví dụ này là chuỗi thực để thay thế bằng chỉ định? –

+0

@ r4d2: Anh ta lợi dụng mục tiêu là đồng phục 'A', 'tr/A-Z/A /' dịch JAM thành AAA. Đó là lý do tại sao tôi đăng theo dõi của tôi như là một trường hợp tổng quát hơn. –

Các vấn đề liên quan