2009-12-26 26 views
10

Có bất kỳ công cụ biểu thức chính quy nào (miễn phí) cho Java, có thể biên dịch cụm từ thông dụng thành DFA và thực hiện nhóm trong khi khớp với DFA không?Động cơ biểu thức chính quy dựa trên DFA cho Java với Capture

Tôi đã tìm thấy dk.brics.automaton và jrexx, cả hai đều biên dịch thành DFA, nhưng dường như không thể chụp nhóm. Trong khi các công cụ khác tôi đã tìm thấy dường như biên dịch cho NFA.

+1

Tại sao bạn cần DFA? –

+1

Để tối ưu hóa hiệu suất. – Sami

+3

Tôi hỏi vì thường những buổi biểu diễn này sẽ phát sinh lợi ích từ việc các công cụ DFA không có khả năng quay lại. Nếu đó là trường hợp, có lẽ bạn có thể đạt được điều tương tự bằng cách sử dụng các nhóm định lượng nguyên tử/sở hữu. Có lẽ bạn có thể đăng một số ví dụ về những gì bạn muốn đạt được? –

Trả lời

-2

bạn có thể thử thư viện biểu thức chính quy Pat @http://www.javaregex.com/.

+0

Từ trang web, ít nhất là không rõ ràng, rằng động cơ này sẽ dựa trên DFA và cũng không hỗ trợ việc thu thập nhóm. Nếu có, và bạn có thể vui lòng xác nhận không. – Sami

+0

lib đó (Stevesoft Pat) hỗ trợ chụp nhóm, nhưng chắc chắn ** không ** dựa trên DFA. –

0

Đối với C, có TRE và thư viện RE2 của Google. TRE sử dụng DFA, RE2 sử dụng NFA (theo như tôi hiểu), cả hai có thể kết hợp nhóm con. Nhưng tôi không thấy một thư viện như vậy cho Java.

+1

RE2 thực sự là REALLY nhanh. Nó là giá trị chỉ vào nó khi mọi người yêu cầu regex và tốc độ. – nes1983

+1

Bạn đã trộn nó lên. TRE sử dụng NFA, RE2 sử dụng cả NFA và DFA. Cụ thể, RE2 sử dụng DFA nếu có nhiều nhất một nhóm chụp, nếu không có NFA. – nes1983

3

thử cái này (có lẽ không DFA nhưng nhanh hơn so với java.util) http://jregex.sourceforge.net/gstarted-advanced.html#ngroups, hoặc cái này: http://userguide.icu-project.org

theo bài kiểm tra đó: http://tusker.org/regex/regex_benchmark.html, cả hai đều nhanh chóng (tất cả chúng ta đều biết rằng các tiêu chuẩn chỉ kiểm tra những gì người tạo ra điểm chuẩn muốn kiểm tra).

Khi tôi cần regex DFA thực sự nhanh, tôi đã sinh ra một quy trình sử dụng grep ;-) (Đối với tệp nhật ký 6GB, thời gian đã cắt giảm từ 10 phút đến vài giây).

+0

Tôi nghi ngờ rằng nó nhanh hơn java.util.regex. Các thư viện nhỏ này đến và đi, java.util.regex được tối ưu hóa sau năm năm. Nếu bạn không sử dụng thuật toán tốt hơn, java.util.regex sẽ đánh bại bạn cuối cùng. Xem câu trả lời của tôi cho một công cụ biểu thức chính quy hoàn toàn khác với java.util.regex, dựa trên DFA và do đó nhanh hơn. – nes1983

-2

dk.brics.automaton là DFA có vẻ như đang chụp nhóm. Tôi hy vọng rằng tính năng này là mới trong hai năm kể từ khi câu hỏi này. Kiểm tra lớp AutomatonMatcher.

Xem http://www.brics.dk/automaton/doc/dk/brics/automaton/AutomatonMatcher.html#group(int)

+0

Nó không thực sự hỗ trợ kết hợp nhóm. – nes1983

+0

Cập nhật với liên kết đến API chụp nhóm –

+0

Có, nhưng bạn đã đọc liên kết đó chưa? "không hỗ trợ chụp nhóm nhóm hợp lệ duy nhất là 0 (toàn bộ kết quả phù hợp)". – nes1983

Các vấn đề liên quan