2013-05-02 11 views
10

Dlaczego poniższy kod nie działa (powoduje fałsz) w językach indyjskich?Kod Java REGEX do sprawdzenia, czy znaki indyjskie nie działają?

System.out.println(Charset.forName("UTF-8").encode("అనువాద") 
       .asCharBuffer().toString().matches("\\p{L}+")); 

System.out.println(Charset.forName("UTF-8").encode("स्वागत") 
       .asCharBuffer().toString().matches("\\p{L}+")); 

System.out.println(Charset.forName("UTF-8").encode("நல்வரவு") 
       .asCharBuffer().toString().matches("\\p{L}+")); 

Powyższy kod zwraca wartość false. Jaki jest problem z tym wyrażeniem regularnym? Jak zweryfikować jakąkolwiek postać unicode na świecie?

+2

Powinieneś wykonać '" అనువాద ". Matches (" \\ p {L} + ")'. Ponadto upewnij się, że zarówno edytor, jak i kompilator używają tego samego zestawu znaków (najlepiej UTF-8). –

+0

Cześć Joop, upewniłem się, że kompilator i edytor używają UTF-8. Ale nadal "అనువాద". Mecze ("\\ p {L} +") wyniki są fałszywe. – suren

+0

Użyj '" (\\ p {L} | \\ p {M}) + "' lub lepiej @stema '" [\\ pL \\ pM] + "', również zliczając znaki diakrytyczne jako prawidłowe. –

Odpowiedz

4

tylko przechwytuje litery, ale potrzebne są również znaki, które można przechwycić za pomocą \p{Mark}.

System.out.println("स्वागत".matches("[\\pL\\pM]+")); 
+2

+1, ale wyrażenie to "[\\ pL \\ pM] +" – stema

+0

Działało idealnie. Dziękuję bardzo? Czy to samo będzie działać ze wszystkimi międzynarodowymi postaciami? Czy mógłbyś wyjaśnić mi o znakach? Dzięki jeszcze raz. – suren

+0

W skrócie znak jest specjalnym znakiem, który jest połączony z istniejącym znakiem, takim jak umlaut. Jest o wiele więcej, polecam przeczytanie tego artykułu, jeśli chcesz zrozumieć więcej. http://www.regular-expressions.info/unicode.html –