2010-03-07 36 views
26

Tôi đang cố gắng viết chức năng lọc cho ứng dụng của mình sẽ lấy chuỗi đầu vào và lọc ra tất cả các đối tượng không khớp với đầu vào đã cho theo một cách nào đó. Cách dễ nhất để làm điều này là sử dụng phương thức chứa String, nghĩa là chỉ cần kiểm tra xem đối tượng (biến String trong đối tượng) có chứa chuỗi được chỉ định trong bộ lọc hay không, nhưng điều này sẽ không tính đến dấu trọng âm.Tìm kiếm chuỗi Java bỏ qua các dấu

Đối tượng được đề cập về cơ bản là Người và các chuỗi tôi đang cố gắng khớp là tên. Vì vậy, ví dụ nếu ai đó tìm kiếm Joao tôi sẽ mong đợi Joáo được bao gồm trong tập kết quả. Tôi đã sử dụng lớp Collator trong ứng dụng của tôi để sắp xếp theo tên và nó hoạt động tốt vì nó có thể so sánh, tức là sử dụng ngôn ngữ UK Locale á đến trước b nhưng sau a. Nhưng obvisouly nó không trả về 0 nếu bạn so sánh a và á bởi vì chúng không bằng nhau.

Vì vậy, có ai có bất kỳ ý tưởng nào về cách tôi có thể thực hiện việc này không?

+0

Có thể trùng lặp của [Java. Bỏ qua các dấu trọng âm khi so sánh các chuỗi] (http://stackoverflow.com/questions/2373213/java-ignore-accents-when-comparing-strings) – Barett

Trả lời

69

Sử dụng java.text.Normalizer và ảnh chụp regex để loại bỏ diacritics.

public static String removeDiacriticalMarks(String string) { 
    return Normalizer.normalize(string, Form.NFD) 
     .replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
} 

Mà bạn có thể sử dụng như sau:

String value = "Joáo"; 
String comparisonMaterial = removeDiacriticalMarks(value); // Joao 
+1

Tôi rút lại câu trả lời của mình! Không bao giờ gặp java.text.Normalizer, nhờ mẹo – Brabster

+0

Cảm ơn, chính xác những gì tôi cần. – DaveJohnston

+0

Điều này thật tuyệt. Tôi đã cố gắng để làm regex trận đấu trên dây không ascii mặc dù không thành công. Bình thường hóa dường như là cách tốt nhất để làm điều đó. – ankimal

2

collator không return 0 cho a và á, nếu bạn cấu hình nó để bỏ qua dấu:

public boolean isSame(String a, String b) { 
    Collator insenstiveStringComparator = Collator.getInstance(); 
    insenstiveStringComparator.setStrength(Collator.PRIMARY); 
    // Collator.PRIMARY also works, but is case senstive 
    return insenstiveStringComparator.compare(a, b) == 0; 
} 

isSame ("a", "á") mang lại giá trị hiện tại

0

Tôi đã viết một lớp để tìm kiếm các văn bản tiếng Ả Rập máng bằng cách bỏ qua dấu phụ (KHÔNG loại bỏ chúng). có thể bạn có thể có được ý tưởng hoặc sử dụng nó theo một cách nào đó.

DiacriticInsensitiveSearch.java

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