2016-10-03 4 views
2

Я хочу знать, что текст содержит любое письмо на урду или арабском языке .. используя это условие, которое приводит к ложным результатам при появлении специальных символов. Каков правильный способ сделать это. Любая библиотека или для чего это правильное регулярное выражение?Как узнать текст на арабском языке или на урду

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

     /*  }*/ 
      } 
+0

Я думаю, что вам нужно преобразовать символ в UTF, а затем сравнить его с кодом урду и арабского символа. –

+1

Попробуйте 'if (cap.matches (" (? S). * [\\ p {Arabic} \\ u0600 - \\ u06FF \\ u0750 - \\ u077F \\ uFB50 - \\ uFDFF \\ uFE70 - \\ uFEFF]. * ")) {/ * ДА, это либо арабский, либо урду * /}'. Чтобы проверить только урду, используйте '' (? S). * [\\ u0600 - \\ u06FF \\ u0750 - \\ u077F \\ uFB50 - \\ uFDFF \\ uFE70 - \\ uFEFF]. * "' –

ответ

2

Взглянув на 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 так, что . может соответствовать LineBreak символы тоже.

Для лучшей работы с 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().

+1

Это идеальное решение для моей проблемы, спасибо большое –

+0

на cap.matches ("(? S). * \\ p {Arabic}. *") Andriod stuido, говорящий о своем неизвестном классе –

+0

Это означает, что вы можете использовать либо '\\ p {IsArabic} 'или' \\ p {InArabic} ', проверьте и сообщите об этом. Android использует библиотеку регулярных выражений ICU, и она немного отличается от Java 'java.util.regex'. –

0

попробовать это здесь вы можете получить, является ли текст на арабском языке или не

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

0

Вы можете обойтись без Regex здесь, все, что вам нужно, чтобы найти то, что арабский и урду диапазон UTF Персонаж а затем посмотрите, соответствует ли введенный текст диапазону, и поскольку Urdu написан с арабскими символами, все, что вам нужно, это арабский диапазон, который равен 0600-06FF.

Смежные вопросы