2011-11-10 16 views
6

Có cách nào dễ dàng để thêm các công cụ sửa đổi regex như 'i' vào biểu thức chính quy được trích dẫn không? Ví dụ:Cách thêm công cụ sửa đổi vào biểu thức chính quy (qr) được trích dẫn

$pat = qr/F(o+)B(a+)r/; 
$newpat = $pat . 'i'; # This doesn't work 

Cách duy nhất tôi có thể nghĩ là để print "$pat\n" và trở lại (?-xism:F(o+)B(a+)r) và cố gắng loại bỏ các 'i' trong ?-xism: với quyền thay người

Trả lời

6

Bạn không thể đặt lá cờ bên trong kết quả của qr mà bạn đã có, bởi vì nó được bảo vệ. Thay vào đó, sử dụng này:

$pat = qr/F(o+)B(a+)r/i; 
2

Bạn có thể sửa đổi một regex hiện như thể nó là một chuỗi chừng nào bạn biên dịch lại nó sau đó

my $pat = qr/F(o+)B(a+)r/; 
    print $pat, "\n"; 
    print 'FOOBAR' =~ $pat ? "match\n" : "mismatch\n"; 

    $pat =~ s/i//; 
    $pat = qr/(?i)$pat/; 
    print $pat, "\n"; 
    print 'FOOBAR' =~ $pat ? "match\n" : "mismatch\n"; 

OUTPUT

(?-xism:F(o+)B(a+)r) 
    mismatch 
    (?-xism:(?i)(?-xsm:F(o+)B(a+)r)) 
    match 
+1

+1 để hiển thị cách thích hợp để tạo công cụ sửa đổi thành một regex hiện có. Phần '(?…)' Được ghi lại trong http://perldoc.perl.org/perlre.html#Extended-Patterns – daxim

+2

Điều này không hoạt động sau Perl 5.12 vì thay đổi chuỗi regex. –

1

Hình như cách duy nhất là xâu chuỗi RE, thay thế (-i) bằng (i-) và báo lại nó:

my $pat = qr/F(o+)B(a+)r/; 
my $str = "$pat"; 
$str =~ s/(?<!\\)(\(\?\w*)-([^i:]*)i([^i:]*):/$1i-$2$3:/g; 
$pati = qr/$str/; 

UPDATE: perl 5,14 dấu ngoặc kép regexps trong một different way, vì vậy mẫu của tôi có lẽ sẽ giống như

my $pat = qr/F(o+)B(a+)r/; 
my $str = "$pat"; 
$str =~ s/(?<!\\)\(\?\^/(?^i/g; 
$pati = qr/$str/; 

Nhưng tôi không có perl 5.14 trong tầm tay và không thể kiểm tra nó.

UPD2: Tôi cũng không thể kiểm tra dấu ngoặc mở mở.

+0

Điều này sẽ không hoạt động nữa vì quá trình xâu chuỗi regex không hoạt động trong Perl 5.14. –

+0

@briandfoy: Cảm ơn bạn đã tìm hiểu. Tôi đã cập nhật câu trả lời của mình, nhưng tôi không chắc chắn rằng phần 5.14 có hoạt động không. – Dallaylaen