Câu hỏi này hơi phức tạp và googling không thực sự hữu ích. Tôi sẽ cố gắng chỉ đưa vào những khía cạnh liên quan của nó.Node.JS Động cơ Regex không thành công trên đầu vào lớn
Tôi có một tài liệu lớn trong khoảng định dạng sau:
Sample Input:
ABC is a word from one line of this document. It is followed by
some random line
PQR which happens to be another word.
This is just another line
I have to fix my regular expression.
Here GHI appears in the middle.
This may be yet another line.
VWX is a line
this is the last line
Tôi cố gắng để loại bỏ các phần của văn bản theo dưới đây:
- Từ một trong hai:
- ABC
- DEF
- GHI
- Để một trong hai (trong khi giữ lại từ này):
- PQR
- STU
- VWX
Những lời mà làm "Từ" có thể xuất hiện ở bất kỳ đâu trong dòng (Nhìn vào GHI). Nhưng để loại bỏ toàn bộ dòng cần phải được loại bỏ. (Toàn bộ dòng chứa GHI cần phải được loại bỏ như trong đầu ra mẫu dưới đây)
Sample Output:
PQR which happens to be another word.
This is just another line
I have to fix my regular expression.
VWX is a line
this is the last line
Ví dụ trên thực tế dường như dễ dàng đối với tôi cho đến khi tôi chạy nó chống lại tập tin đầu vào rất lớn (49KB)
Những gì tôi đã cố gắng:
Các biểu hiện thường xuyên tôi hiện đang sử dụng là (với trường hợp không nhạy cảm và mu ltiline modifier):
^.*\b(abc|def|ghi)\b(.|\s)*?\b(pqr|stu|vwx)\b
Vấn đề
Các công trình regexp trên tuyệt vời trên các tập tin văn bản nhỏ. Nhưng không thành công/làm hỏng động cơ trên các tệp lớn. Tôi đã thử nó so với đồng dưới đây:
- V8 (Node.js): treo cứng
- Rhino: treo cứng
- Python: treo cứng
- Java:
StackoverflowError
(Stack trace được trả vào cuối của câu hỏi này) - IonMonkey (Firefox): CÔNG TRÌNH!
Input Thực tế:
- Input ban đầu của tôi: http://ideone.com/W4sZmB
biểu hiện thường xuyên của tôi (split trên nhiều dòng cho rõ ràng):
^.*\\b(patient demographics|electronically signed|md|rn|mspt|crnp|rt)\\b (.|\\s)*? \\b(history of present illness|hpi|chief complaint|cc|reason for consult|patientis|inpatient is|inpatientpatient|pt is|pts are|start end frequency user)\\b
Câu hỏi:
- Cụm từ thông dụng của tôi có đúng không? Nó có thể được tối ưu hóa thêm để tránh vấn đề này không?
- Trong trường hợp chính xác, tại sao các công cụ khác treo vô hạn? Một phần của stack trace là dưới đây:
Stack Trace:
Exception in thread "main" java.lang.StackOverflowError
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4218)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345)
at java.util.regex.Pattern$Branch.match(Pattern.java:4114)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4357)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078)
PS: tôi thêm nhiều thẻ cho câu hỏi này vì tôi đã thử nó trên những môi trường và thí nghiệm thất bại.
Vấn đề này có thể là hiện thực khác nhau giữa các công cụ regexp. Chủ yếu là có hai loại công cụ tìm lại: 'backtracking search-based' và' NFA-based'. Công cụ 'NFA-based' cần nhiều bộ nhớ hơn để xử lý trước regexp (để xây dựng NFA) trong khi đó, không có bộ đệm ngược. Tuy nhiên, tình hình thay đổi khi làm trận đấu. Dưới đây là một số tài liệu tham khảo hữu ích: http://swtch.com/~rsc/regexp/ – Marcus