如何确定文本是阿拉伯语还是乌尔都语

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

         /*       }*/
            }

我认为您需要将字符转换为UTF,然后将其与乌尔都语和阿拉伯语字符代码进行比较。 - Shahzain ali
1
尝试使用 if (cap.matches("(?s).*[\\p{Arabic}\\u0600-\\u06FF\\u0750-\\u077F\\uFB50-\\uFDFF\\uFE70-\\uFEFF].*")) { /*是阿拉伯语或乌尔都语*/ }。如果只想检查乌尔都语,请使用 "(?s).*[\\u0600-\\u06FF\\u0750-\\u077F\\uFB50-\\uFDFF\\uFE70-\\uFEFF].*" - Wiktor Stribiżew
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 修饰符,使得 . 可以匹配换行符。
为了更好的性能,你可以使用反向类而不是第一个 .*:分别是 "(?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()

1
这是我问题的完美解决方案,非常感谢。 - Usman Saeed
在 Android Studio 中,当 cap.matches("(?s).\p{Arabic}.") 时,它会显示未知类。 - Usman Saeed
1
这意味着您可以使用\\p{IsArabic}\\p{InArabic},请检查并告知。Android使用ICU正则表达式库,它与Java的java.util.regex有点不同。 - Wiktor Stribiżew
如果文本来自文本或XML文件或数据库,它也能工作吗? - MindRoasterMir
正则表达式用于在字符串中搜索匹配项,因此它不知道源,只期望纯文本。顺便说一下,使用更有效的 "(?s)[^\\u0600-\\u06FF\\u0750-\\u077F\\uFB50-\\uFDFF\\uFE70‌​-\\uFEFF]*[\\u0600-\\u06FF\\u0750-\\u077F\\uFB50-\\uFDFF\\uFE70‌​-\\uFEFF].*""(?s)\\P{InArabic}*\\p{InArabic}.*" - Wiktor Stribiżew

1
你不需要使用正则表达式,只需找到阿拉伯语和乌尔都语的UTF字符范围,然后检查输入的文本是否匹配该范围。

我认为你的回答是误导性的,并且基于错误的信息。乌尔都语和阿拉伯语字母表的Unicode值不相同。谢谢。 - MindRoasterMir
@MindRoasterMir,那不是我的答案要点,实际上与他将使用的语言无关,他需要找到他正在检查的语言的UTF范围,这可以在网络上找到,我修改了我的答案。 - Gherbi Hicham

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接