2010-02-12 22 views
6

OK, tôi đã nhận được một điều kỳ lạ mà tôi đã bị kẹt trong một thời gian (fri buổi chiều tâm không làm việc tôi đoán).Loại bỏ văn bản bên trong parens, nhưng không phải là parens trong Perl

Có ai biết cách phân tích cú pháp chuỗi và xóa tất cả văn bản bên trong các phông mà không xóa các dấu ngoặc đơn ... nhưng với việc xóa các dấu ngoặc được tìm thấy bên trong.

tức là.

myString = "this is my string (though (I) need (help) fixing it)" 

sau khi chạy nó thông qua những gì tôi muốn nó sẽ như thế nào:

myString = "this is my string()" 

rất quan trọng để giữ cho hai dấu ngoặc ở đó.

Trả lời

2

Nếu bạn muốn sử dụng Regular Expressions mà không sử dụng biểu thức chính quy :: Common. Nhìn vào tính năng "Nhìn xung quanh". Nó được giới thiệu với Perl 5. Bạn có thể đọc thêm về "Look Ahead" và "Look Behind" tại regular-expressions.info. Ngoài ra còn có phần về "Xem xung quanh" trong sách "Biểu thức chính quy thông thường". Tìm trên trang 59.

#!/usr/bin/env perl 

use Modern::Perl; 

my $string = 'this is my (string (that)) I (need help fixing)'; 

$string =~ s/(?<=\()[^)]+[^(]+(?=\))//g; 

say $string; 
6

Bạn cần thoát khỏi dấu ngoặc đơn để ngăn chúng bắt đầu nhóm chụp. Mẫu \(.+\) khớp với chuỗi con dài nhất bắt đầu bằng số ( và kết thúc bằng số ). Điều đó sẽ gobble lên tất cả mọi thứ lên đến ) cuối cùng bao gồm bất kỳ dấu ngoặc đơn can thiệp. Cuối cùng, chúng ta thay thế chuỗi với một chỉ chứa ():

#!/usr/bin/perl 

use strict; use warnings; 

my $s = "this is my string (though (I) need (help) fixing it)"; 

$s =~ s{\(.+\)}{()}; 

print "$s\n"; 
+0

Điều này hoạt động miễn là chỉ có một bộ cấp độ cao nhất của dấu ngoặc đơn. Nếu không, một chuỗi như "đây là của tôi (chuỗi (mà)) tôi (cần giúp sửa chữa)" sẽ trở thành "đây là của tôi()" thay vì "đây là của tôi() I()" – bobDevil

10

Module Regexp::Common giao dịch với hơn 1 cấp cao nhất của dấu ngoặc đơn.

use strict; 
use warnings; 
use Regexp::Common qw/balanced/; 

my @strings = (
    '111(22(33)44)55', 
    'a(b(c(d)(e))f)g(h)((i)j)', 
    'this is my string (though (I) need (help) fixing it)', 
); 

s/$RE{balanced}{-parens=>'()'}/()/g for @strings; 

print "$_\n" for @strings; 

Output:

111()55 
a()g()() 
this is my string()
+1

Woah, Cool! Regexp :: Thường gây bất ngờ cho tôi với tập hợp chi tiết của regexen ... –

+0

Sinan, cảm ơn bạn đã làm rõ mã. –

+0

Tôi không ngạc nhiên rằng nó có thể được thực hiện trong một dòng Perl, nhưng tôi ngạc nhiên rằng nó có thể đọc được! – dreamlax

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