2013-04-16 40 views
10

Tôi muốn tạo cụm từ thông dụng từ một chuỗi có chứa các số và sau đó sử dụng biểu mẫu này làm Mẫu để tìm kiếm các chuỗi tương tự. Ví dụ:tạo cụm từ thông dụng từ một chuỗi

String s = "Page 3 of 23" 

Nếu tôi thay thế tất cả các chữ số bằng cách \d

StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < s.length(); i++) { 
    char c = s.charAt(i); 
    if (Character.isDigit(c)) { 
     sb.append("\\d"); // backslash d 
    } else { 
     sb.append(c); 
     } 
    } 

    Pattern numberPattern = Pattern.compile(sb.toString()); 

// Pattern numberPattern = Pattern.compile("Page \d of \d\d"); 

Tôi có thể sử dụng để phù hợp với chuỗi tương tự (ví dụ "Page 7 of 47"). Vấn đề của tôi là nếu tôi làm điều này một cách ngây thơ một số metacharacters chẳng hạn như (){}-, v.v. sẽ không được thoát. Có một thư viện để làm điều này hay một tập hợp đầy đủ các ký tự cho các biểu thức thông thường mà tôi phải và không được trốn thoát? (Tôi có thể cố gắng trích xuất chúng từ Javadocs nhưng lo lắng về việc thiếu một cái gì đó).

Cách khác là có thư viện đã thực hiện việc này (Tôi không ở giai đoạn này muốn sử dụng giải pháp Xử lý ngôn ngữ tự nhiên đầy đủ).

LƯU Ý: Câu trả lời được chỉnh sửa của @ dasblinkenlight hiện hoạt động cho tôi!

+0

Đây là câu trả lời cho câu hỏi ký tự nào, tôi không biết bất kỳ thư viện nào để tạo regex dù: http://stackoverflow.com/questions/399078/what-special-characters-must-be-escaped-in biểu thức bất thường –

+0

@Evan cảm ơn. Tôi chỉ quan tâm đến Java để trông giống như một nguồn tài nguyên hữu ích. –

Trả lời

10

thư viện regexp Java cung cấp chức năng này:

String s = Pattern.quote(orig); 

Các "trích dẫn" chuỗi sẽ có tất cả metacharacters nó trốn thoát. Đầu tiên, thoát chuỗi của bạn, và sau đó đi qua nó và thay thế các chữ số bằng cách \d để thực hiện một biểu thức chính quy. Vì thư viện regex sử dụng \Q\E để trích dẫn, bạn cần phải đính kèm phần regex của mình theo các giá trị nghịch đảo của \E\Q.

Một điều tôi sẽ thay đổi trong triển khai của bạn là thuật toán thay thế: thay vì thay thế từng ký tự, tôi sẽ thay thế chữ số thành các nhóm. Điều này sẽ cho phép một biểu thức được tạo từ các chuỗi đối sánh Page 3 of 23 như Page 13 of 23Page 6 of 8.

String p = Pattern.quote(orig).replaceAll("\\d+", "\\\\E\\\\d+\\\\Q"); 

này sẽ produce"\QPage \E\d+\Q of \E\d+\Q\E" không có vấn đề gì ở trang số và đếm có ban đầu. Đầu ra chỉ cần một, không phải hai dấu gạch chéo trong \d, bởi vì kết quả được cấp trực tiếp cho công cụ regex, bỏ qua trình biên dịch Java.

+0

Tuyệt, tôi không biết về phương pháp này. – toniedzwiedz

+0

@dasblinkenlight Tuyệt vời! Đồng ý tôi có thể tìm các chữ số lặp lại nhưng cũng có giá trị phỏng đoán cho tôi trong việc đếm số lượng chính xác. Tôi có thể sử dụng cả hai cách tiếp cận. –

+0

@ peter.murray.rust Xem sửa đổi cuối cùng: số lượng dấu gạch chéo cần thiết để làm cho hai dấu gạch chéo trong đầu ra thực sự vô lý - lần hai cho trình biên dịch và thời gian hai cho thư viện regex, cho tổng số tám dấu gạch chéo. – dasblinkenlight

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