Tôi đang phân tích cú pháp (loài) tên có dạng:biểu hiện thường xuyên đi vào vòng lặp vô hạn
Parus Ater
H. sapiens
T. rex
Tyr. rex
mà thường có hai nhiệm kỳ (nhị thức) nhưng đôi khi có 3 hoặc nhiều hơn.
Troglodytes troglodytes troglodytes
E. rubecula sensu stricto
tôi đã viết
[A-Z][a-z]*\.?\s+[a-z][a-z]+(\s*[a-z]+)*
mà làm việc hầu hết thời gian nhưng đôi khi đi vào một vòng lặp vô hạn. Phải mất một thời gian để theo dõi nó đã được trong regex phù hợp và sau đó tôi nhận ra nó là một lỗi đánh máy và tôi nên viết
[A-Z][a-z]*\.?\s+[a-z][a-z]+(\s+[a-z]+)*
hoạt động đúng.
Câu hỏi của tôi là:
- tại sao vòng lặp này xảy ra?
- có cách nào để tôi có thể kiểm tra các lỗi regex tương tự trước khi chạy chương trình không? Nếu không, sẽ rất khó để bẫy chúng trước khi prgram được phân phối và gây ra vấn đề.
[Lưu ý: Tôi không cần biểu thức tổng quát hơn cho các loài - có đặc điểm kỹ thuật regex chính thức 100+ cho tên loài - đây chỉ là bộ lọc ban đầu]. Chú ý: Vấn đề nảy sinh bởi vì mặc dù hầu hết các tên đã được trích xuất chính xác thành 2 hoặc đôi khi 3/4 thuật ngữ (như chúng in nghiêng) có một vài sai tích cực (như "Homo sapiens lives in big cities like London"
) và trận đấu thất bại tại "L". ]
LƯU Ý: Khi gỡ lỗi, tôi thấy rằng regex thường hoàn thành nhưng rất chậm (ví dụ: trên các chuỗi đích ngắn hơn). Nó là có giá trị mà tôi tìm thấy lỗi này thông qua một trường hợp bệnh lý. Tôi đã học được một bài học quan trọng!
Bạn không thể dự đoán đơn giản nếu một regex sẽ nhập một vòng lặp vô hạn. Nếu bạn có regexes quá phức tạp ("100+ dòng regex"), nó có thể là (tôi nói "có thể") mà bạn cần một số loại phân tích cú pháp để thay thế. –
Tôi nghĩ bạn nên viết '(\ s + [az] +) +' thay vì '\ s + [az] [az] + (\ s + [az] +) *' – shift66
@ shift66 Tôi đã viết '\ s + [az] [az] + 'bởi vì tôi muốn đảm bảo thuật ngữ thứ hai có ít nhất 2 ký tự. Tôi không quan tâm đến thứ ba và sau đó. –