Làm cách nào tôi có thể xóa việc chụp từ các nhóm phụ lồng nhau tùy ý trong chuỗi regex Perl? Tôi muốn lồng ghép bất kỳ regex nào vào một biểu thức bao bọc để nắm bắt sub-regex như một thực thể toàn bộ cũng như các nhóm tiếp theo được biết đến tĩnh. Tôi có cần phải chuyển đổi chuỗi regex theo cách thủ công vào việc sử dụng tất cả các nhóm không bắt giữ (?:)
(và hy vọng tôi không gây rối), hoặc có cơ chế thư viện Perl hoặc thư viện cung cấp điều này không?Làm cách nào để tạo một regex Perl tùy ý hoàn toàn không bắt được? (Trả lời: Bạn không thể)
# How do I 'flatten' $regex to protect $2 and $3?
# Searching 'ABCfooDE' for 'foo' OK, but '((B|(C))fo(o)?(?:D|d)?)', etc., breaks.
# I.E., how would I turn it effectively into '(?:(?:B|(?:C))fo(?:o)?(?:D|d)?)'?
sub check {
my($line, $regex) = @_;
if ($line =~ /(^.*)($regex)(.*$)/) {
print "<", $1, "><", $2, "><", $3, ">\n";
}
}
Phụ Lục: Tôi mơ hồ nhận thức $&
, $`
và $'
và đã được khuyên để tránh chúng nếu có thể, và tôi không có quyền truy cập vào ${^PREMATCH}
, ${^MATCH}
và ${^POSTMATCH}
trong môi trường Perl 5,8 của tôi . Ví dụ trên có thể được phân đoạn thành các đoạn 2/3 bằng cách sử dụng các phương thức như thế này và các trường hợp thực tế phức tạp hơn có thể lặp lại thủ công điều này, nhưng tôi nghĩ tôi muốn một giải pháp chung nếu có thể.
Câu trả lời được chấp nhận: Điều tôi muốn tồn tại và đáng ngạc nhiên (ít nhất là) không phải là một nhóm đóng gói làm cho nội dung của nó mờ đục, chẳng hạn như backreferences vị trí sau đó xem nội dung dưới dạng một thực thể duy nhất và tên de-scoped. gbacon có cách giải quyết hữu ích cho Perl 5.10+ và FM hiển thị cơ chế lặp lại thủ công cho bất kỳ phiên bản nào có thể thực hiện cùng một hiệu ứng trong các trường hợp cụ thể, nhưng j_random_hacker gọi nó là không có cơ chế ngôn ngữ thực để đóng gói các biểu thức con.
+1 Công việc tuyệt vời với các chỉnh sửa tiếp theo. – FMc