2010-06-23 32 views
8

Tôi cố gắng khớp các ký tự unicode trong Java.Làm cách nào để khớp các ký tự unicode trong Java

Input String: informa

String để khớp với nhau: informátion

Cho đến nay tôi đã cố gắng này:

Pattern p= Pattern.compile("informa[\u0000-\uffff].*", (Pattern.UNICODE_CASE|Pattern.CANON_EQ|Pattern.CASE_INSENSITIVE)); 
    String s = "informátion"; 
    Matcher m = p.matcher(s); 
    if(m.matches()){ 
     System.out.println("Match!"); 
    }else{ 
     System.out.println("No match"); 
    } 

Nó đi ra như "Không phù hợp". Ý tưởng nào?

+2

Làm thế nào về 'îñfórmåtìön'? Nên nó "Phù hợp!"? – kennytm

+0

Vâng, đó sẽ là ý tưởng. Bây giờ chỉ có á sẽ làm. – ankimal

Trả lời

12

Thuật ngữ "Ký tự Unicode" không đủ cụ thể. Nó sẽ khớp với mỗi ký tự trong phạm vi Unicode, do đó cũng có các ký tự "bình thường". Tuy nhiên, thuật ngữ này thường được sử dụng khi một thực sự là có nghĩa là "các ký tự không nằm trong số printable ASCII range".

Trong các thuật ngữ regex sẽ là [^\x20-\x7E].

boolean containsNonPrintableASCIIChars = string.matches(".*[^\\x20-\\x7E].*"); 

Tùy thuộc vào những gì bạn muốn làm gì với thông tin này, đây là một số câu trả lời theo dõi hữu ích:

+0

java.text.Normalizer có vẻ như là cách để đi (viên đạn 2). Unicode phù hợp với vẻ ngoài dường như không hoạt động như mong đợi và tôi có thể bị trúng với một hình phạt hiệu suất ngay cả khi nó đã làm. – ankimal

+0

Nếu yêu cầu chức năng * thực tế * của bạn là "loại bỏ dấu phụ", thì đó thực sự là cách để đi. Câu hỏi ban đầu của bạn chỉ không được xây dựng như thế :) – BalusC

+0

Tôi nghĩ rằng câu hỏi không rõ ràng. Mục tiêu là để có thể kết hợp "thông tin" với "informátion", do đó khả năng kết hợp 'a' với bất kỳ hình thức nào giống như 'á', 'å' vv. Loại bỏ dấu phụ và sau đó khớp có vẻ là cách đi. – ankimal

6

Có phải vì informa không phải là một chuỗi con của informátion?

Mã của bạn hoạt động như thế nào nếu bạn xóa a cuối cùng từ informa trong regex của mình?

+0

informa \ u0301 hoạt động trong chuỗi mẫu. Điều này phải làm với trường hợp Pattern.CANON_EQ. – ankimal

+0

Quên để đặt trong liên kết này, http://java.sun.com/docs/books/tutorial/essential/regex/pattern.html (Pattern.CANON_EQ) – ankimal

1

Có vẻ như bạn muốn kết hợp các chữ cái trong khi bỏ qua các dấu phụ. Nếu đúng, hãy chuẩn hóa các chuỗi của bạn thành dạng NFD, loại bỏ các dấu phụ, và sau đó thực hiện tìm kiếm của bạn.

String normalized = java.text.Normalizer.normalize(textToSearch, java.text.Normalizer.Form.NFD); 
String withoutDiacritical = normalized.replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
// Search code goes here... 

Để tìm hiểu thêm về NFD:

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