2013-05-02 8 views
10

Warum funktioniert der folgende Code nicht mit indischen Sprachen?Java-REGEX-Code zur Validierung von indischen Schriftzeichen funktioniert nicht?

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}+")); 

Der gesamte obige Code gibt false zurück. Was ist das Problem mit dieser Regex? Wie kann man einen Unicode-Charakter in der Welt validieren?

+2

Sie sollten tun "". Übereinstimmungen ("\\ p {L} +") '. Stellen Sie außerdem sicher, dass sowohl der Editor als auch der Compiler den gleichen Zeichensatz verwenden (bester UTF-8). –

+0

Hallo Joop, ich habe dafür gesorgt, dass der Compiler und der Editor UTF-8 benutzen. Aber immer noch "అనువాద". Übereinstimmungen ("\\ p {L} +") ergibt false. – suren

+0

Verwenden Sie '" (\\ p {L} | \\ p {M}) + "' oder besser @stem '' [\\ pL \\ pM] + "', wobei auch diakritische Zeichen als gültig gezählt werden. –

Antwort

4

\p{Letter} erfasst nur Buchstaben, aber Sie benötigen auch Markierungen, die Sie mit \p{Mark} erfassen können.

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

+1, aber der Ausdruck ist dann '[\\ pL \\ pM] +' – stema

+0

Es funktionierte perfekt. Ich danke dir sehr? Wird das gleiche mit allen internationalen Charakteren funktionieren? Könnten Sie mir bitte etwas über Marken erklären? Danke noch einmal. – suren

+0

Kurz gesagt, eine Markierung ist ein Sonderzeichen, das mit einem vorhandenen Zeichen wie einem Umlaut kombiniert wird. Es gibt viel mehr, ich empfehle diesen Artikel zu lesen, wenn Sie mehr verstehen müssen. http://www.regular-expressions.info/unicode.html –

Verwandte Themen