Trước tiên, bạn cần phải quyết định những gì tạo nên dấu ngoặc, và nếu họ có thể được lồng vào nhau. (cho câu trả lời này, tôi sẽ giả định rằng họ có thể). Sau đó, bạn cần phải loại bỏ những khối Dấu ngoặc đơn từ văn bản và thay thế nó bằng một trình giữ chỗ:
my @parens;
$str =~ s/(\((?: (?0)|[^()])* \))/push @parens, $1; "PARENS_$#parens"/gex;
Vì vậy, bây giờ bạn chỉ còn lại cái gì đó trông giống như:
'100% California Grown Olives, Water, Salt And Ferrous Gluconate PAREN_0,asasd,
sadasdas.'
Và nó là đơn giản bây giờ để chia nó trên dấu phẩy. Sau đó, trên mỗi phần tách, quét cho PAREN_\d+
mã thông báo và thay thế chúng bằng các mã từ mảng @parens
. Bạn có thể cần phải sử dụng một tên trình giữ chỗ độc đáo hơn tùy thuộc vào nội dung nguồn của bạn.
Cái gì như:
s/PARENS_(\d+)/$parens[$1]/ge for my @segs = split /,\s*/ => $str;
say for @segs;
mà cho một ví dụ chuỗi:
my $str = "foo (b,a,r), baz (foo, (bar), baz), biz";
in:
foo (b,a,r)
baz (foo, (bar), baz)
biz
Nguồn
2011-12-12 21:56:24
Có khả năng có dấu ngoặc ôm không? Nếu vậy, regexes có thể không phù hợp với hóa đơn. –
không, không thể. chỉ có một cặp dấu ngoặc đơn, hoặc cặp vợ chồng nhưng KHÔNG lồng nhau – snoofkin