5

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

   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);

         /*       }*/
            }
4

3 回答 3

4

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

U+0600 to U+06FF
U+0750 to U+077F
U+FB50 to U+FDFF
U+FE70 to U+FEFF

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

所以,你可以使用

if (cap.matches("(?s).*[\\u0600-\\u06FF\\u0750-\\u077F\\uFB50-\\uFDFF\\uFE70‌​-\\uFEFF].*"))
{
    /*There is an Urdu character*/
} 
else if (cap.matches("(?s).*\\p{InArabic}.*"))
{  
    /* The string contains an Arabic character */ 
}
else { /*No Arabic nor Urdu chars detected */ }

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

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

请注意,您也可以使用更短的"[\\u0600-\\u06FF\\u0750-\\u077F\\uFB50-\\uFDFF\\uFE70‌​-\\uFEFF]""\\p{InArabic}"带有Matcher#find().

于 2016-10-03T11:30:44.133 回答
1

您可以在此处不使用 Regex,您只需要查找阿拉伯语和乌尔都语 UTF 字符范围是什么,然后检查输入的文本是否与范围匹配。

于 2016-10-03T11:06:02.483 回答
0

试试这个here你可以得到文本是否是阿拉伯语

var arregex = /[\u0600-\u06FF]/; var test = arregex.test(text); return test;

于 2016-10-03T11:04:42.073 回答