2010-03-07 10 views
26

मैं अपने एप्लिकेशन के लिए एक फ़िल्टर फ़ंक्शन लिखने की कोशिश कर रहा हूं जो एक इनपुट स्ट्रिंग लेगा और उन सभी ऑब्जेक्ट्स को फ़िल्टर करेगा जो किसी भी तरह से दिए गए इनपुट से मेल नहीं खाते हैं। ऐसा करने का सबसे आसान तरीका स्ट्रिंग की विधि का उपयोग करना होगा, यानी बस यह जांचें कि ऑब्जेक्ट (ऑब्जेक्ट में स्ट्रिंग वेरिएबल) में फ़िल्टर में निर्दिष्ट स्ट्रिंग है, लेकिन यह उच्चारण के लिए जिम्मेदार नहीं होगा।अक्षरों को अनदेखा करने के लिए जावा स्ट्रिंग खोज

प्रश्न में वस्तु मूल रूप से व्यक्ति हैं, और तार जो मैं मिलान करने की कोशिश कर रहा हूं वे नाम हैं। तो उदाहरण के लिए यदि कोई जोओओ की खोज करता है तो मैं उम्मीद करता हूं कि जोआ को परिणाम सेट में शामिल किया जाएगा। मैंने नाम से सॉर्ट करने के लिए पहले से ही मेरे आवेदन में कोलेटर श्रेणी का उपयोग किया है और यह अच्छी तरह से काम करता है क्योंकि यह तुलना कर सकता है, यानी यूके लोकेल का उपयोग बी से पहले आता है लेकिन ए के बाद आता है। लेकिन obvisouly यह 0 वापस नहीं करता है अगर आप तुलना करते हैं और क्योंकि वे बराबर नहीं हैं।

तो क्या किसी को पता है कि मैं यह कैसे कर सकता हूं?

+0

[जावा के संभावित डुप्लिकेट। स्ट्रिंग की तुलना करते समय उच्चारणों को अनदेखा करें] (http://stackoverflow.com/questions/2373213/java-ignore-accents-when-comparing-strings) – Barett

उत्तर

69

java.text.Normalizer का उपयोग करें और diacritics से छुटकारा पाने के लिए रेगेक्स का शॉट बनाएं।

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

कौन सा आप के रूप में उपयोग कर सकते हैं इस प्रकार है:

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

मैंने अपना जवाब वापस ले लिया! Java.text.Normalizer पर कभी न आएं, टिप – Brabster

+0

के लिए धन्यवाद धन्यवाद, बिल्कुल मुझे जो चाहिए था। – DaveJohnston

+0

यह बहुत अच्छा है। मैं असफल होने के बावजूद गैर-असीसी तारों पर रेगेक्स मैचों को करने की कोशिश कर रहा था। सामान्यीकरण ऐसा करने का सबसे अच्छा तरीका प्रतीत होता है। – ankimal

2

कोलेटर एक और एक के लिए वापसी 0, करता है आप इसे कॉन्फ़िगर अगर विशेषक अनदेखी करने के लिए:

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 ("ए", "á") अब सच उत्पन्न करता है

0

मैंने डायक्रिटिक को अनदेखा करके उन्हें अचूक अरबी ग्रंथों की खोज के लिए एक कक्षा लिखी है (उन्हें हटा नहीं रहा है)। शायद आप विचार प्राप्त कर सकते हैं या किसी भी तरह से इसका इस्तेमाल कर सकते हैं।

DiacriticInsensitiveSearch.java

संबंधित मुद्दे