<select[^>]*>[^<]*(?:<(?!/select>)[^<]*)*</select>
... hoặc trong con người có thể đọc được dạng:
<select[^>]*> # start tag
[^<]* # anything except opening bracket
(?: # if you find an open bracket
<(?!/select>) # match it if it's not part of end tag
[^<]* # consume any more non-brackets
)* # repeat as needed
</select> # end tag
Đây là ví dụ về kỹ thuật "vòng lặp không được kiểm soát" Friedl phát triển trong cuốn sách của mình, Mastering Regular Expressions. Tôi đã làm một bài kiểm tra nhanh trong RegexBuddy bằng cách sử dụng mẫu dựa trên các định lượng miễn cưỡng:
(?s)<select[^>]*>.*?</select>
... và mất khoảng 6.000 bước để tìm kết quả phù hợp. Mẫu không được kiểm soát vòng chỉ mất 500 bước. Và khi tôi gỡ bỏ khung đóng từ thẻ kết thúc (</select
), làm cho một trận đấu không thể, nó chỉ yêu cầu 800 bước để báo cáo lỗi.
Nếu hương vị regex của bạn hỗ trợ quantifiers sở hữu, đi trước và sử dụng chúng, quá:
<select[^>]*+>[^<]*+(?:<(?!/select>)[^<]*+)*+</select>
Mất khoảng cùng một số bước để đạt được một trận đấu, nhưng nó có thể sử dụng ít hơn rất nhiều bộ nhớ trong quá trình. Và nếu không có trận đấu nào có thể, nó sẽ thất bại nhanh hơn; trong các thử nghiệm của tôi, nó mất khoảng 500 bước, cùng một số nó đã để tìm một trận đấu.
Nguồn
2010-11-02 15:03:51
Bạn có thể sử dụng định lượng sở hữu.Bạn có thể cung cấp đầu vào mẫu dài làm cho việc thực thi regex của bạn chậm hơn. – Shekhar