我想知道文本是否包含乌尔都语或阿拉伯语中的任何字母..使用这种条件会在出现特殊字符时产生错误的结果。什么是正确的方法。任何库或正确的正则表达式是什么?
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);
/* }*/
}
最佳答案
看一看Wikipedia Urdu alphabet,它包含以下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()
一起使用。