如何知道文字是阿拉伯语还是乌尔都语

Usm*_*eed 5 java regex android arabic urdu

我想知道文本是否包含乌尔都语或阿拉伯语的任何字母..使用这种条件会在出现特殊字符时产生错​​误的结果。什么是正确的方法。

   if (cap.replaceAll("\\s+", "").matches("[A-Za-z]+")
                    || cap.replaceAll("\\s+", "").matches("[A-Za-z0-9]+")) {
                Log.d("isUrdu", "false");
                caption.setTypeface(Typeface.DEFAULT);
                caption.setTextSize(16);

            } else {
                Log.d("isUrdu", "True");
             /*   if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) {*/
                    caption.setTypeface(typeface);
                    caption.setTextSize(20);

         /*       }*/
            }
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 4

看一下维基百科乌尔都语字母表,它包括以下 Unicode 范围:

\n\n
U+0600 to U+06FF\nU+0750 to U+077F\nU+FB50 to U+FDFF\nU+FE70 to U+FEFF\n
Run Code Online (Sandbox Code Playgroud)\n\n

要匹配阿拉伯字母,您可以使用\\p{InArabic}Unicode 属性类。

\n\n

所以,你可以使用

\n\n
if (cap.matches("(?s).*[\\\\u0600-\\\\u06FF\\\\u0750-\\\\u077F\\\\uFB50-\\\\uFDFF\\\\uFE70\xe2\x80\x8c\xe2\x80\x8b-\\\\uFEFF].*"))\n{\n    /*There is an Urdu character*/\n} \nelse if (cap.matches("(?s).*\\\\p{InArabic}.*"))\n{  \n    /* The string contains an Arabic character */ \n}\nelse { /*No Arabic nor Urdu chars detected */ }\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,(?s)启用DOTALL修饰符,以便.也可以匹配换行符。

\n\n

为了获得更好的性能matches,您可以分别使用反向类而不是第一个.*:"(?s)[^\\\\u0600-\\\\u06FF\\\\u0750-\\\\u077F\\\\uFB50-\\\\uFDFF\\\\uFE70\xe2\x80\x8c\xe2\x80\x8b-\\\\uFEFF]*[\\\\u0600-\\\\u06FF\\\\u0750-\\\\u077F\\\\uFB50-\\\\uFDFF\\\\uFE70\xe2\x80\x8c\xe2\x80\x8b-\\\\uFEFF].*""(?s)\\\\P{InArabic}*\\\\p{InArabic}.*"

\n\n

请注意,您还可以使用更短的"[\\\\u0600-\\\\u06FF\\\\u0750-\\\\u077F\\\\uFB50-\\\\uFDFF\\\\uFE70\xe2\x80\x8c\xe2\x80\x8b-\\\\uFEFF]""\\\\p{InArabic}"模式Matcher#find()

\n