Регулярное выражение для персидских (арабских) букв без цифр

В Java я ищу регулярное выражение, которое принимает любые персидские (или арабские) буквы, кроме персидских (или арабских) цифр. Чтобы иметь только буквы, я нашел очень хорошее регулярное выражение:

[\u0600-\u065F\u066A-\u06EF\u06FA-\u06FF]

хотя это правда и работает для меня, но мы знаем, что мы можем использовать \\p{L}+ как регулярное выражение, которое принимает все буквы со всех языков мира, и в моем случае (арабский - персидский) я могу изменить его и использовать [\\p{InArabic}]+$.

Но при использовании [\\p{InArabic}]+$ будут приниматься не только все арабские (персидские) буквы, но и арабские цифры, такие как ۱ ۲.

Итак, мой вопрос: как я могу изменить [\\p{InArabic}]+$, чтобы он принимал только буквы, а не цифры, или, другими словами, как я могу ограничить [\\p{InArabic}]+$, чтобы он не принимал никаких чисел?

Обратите внимание, что персидские (арабские) числа выглядят следующим образом: ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۰


person Elyas Hadizadeh    schedule 08.05.2015    source источник


Ответы (2)


Вы можете использовать следующее регулярное выражение:

"[\\p{InArabic}&&\\PN]"

\p{InArabic} соответствует любому символу Unicode Block Arabic (от U+0600 до U+06FF)

\PN соответствует любому символу, не принадлежащему какой-либо категории чисел (обратите внимание на заглавную P).

Пересечение двух наборов дает желаемый результат: оба диапазона цифр (от U+0660 до U+0669) и (от U+06F0 до U+06F9) исключаются.

Тестовый код

for (int i = 0x600; i <= 0x6ff; i++) {
    String c = "" + (char) i;
    System.out.println(Integer.toString(i, 16) + " " + c.matches("[\\p{InArabic}&&\\PN]"));
}
person nhahtdh    schedule 08.05.2015
comment
ты уверен, что так и должно быть? [\\p{InArabic}&&\\PN] потому что моя IDE показывает мне красную линию позади \\PN :( Там написано: ожидается категория символов. - person Elyas Hadizadeh; 08.05.2015
comment
@ElyasHadizadeh: перед публикацией я протестировал регулярное выражение на своей машине (Java 7 и Java 8). Обратите внимание, что я указываю регулярное выражение внутри строкового литерала. Удалите один \, если вам нужна необработанная форма. - person nhahtdh; 08.05.2015
comment
да, вы правы, и это работает как шарм, но очень странно, что моя IDE рисует красную линию за \\PN. (Я использую IntelliJ IDEA 13.0.4 с Java 7 и Java 8, в обоих случаях отображается красная линия за \\PN, но когда я компилирую и запускаю приложение, оно работает правильно. - person Elyas Hadizadeh; 08.05.2015
comment
Спасибо за ответ. Какая у вас IDE? вы знаете, почему у меня такая ошибка? - person Elyas Hadizadeh; 08.05.2015
comment
@ElyasHadizadeh: я использую Eclipse, но Eclipse не выполняет проверку правильности регулярных выражений. Самое большее, что он делает, это проверяет синтаксис строкового литерала. - person nhahtdh; 08.05.2015
comment
ага! в этом причина, потому что IntelliJ выполняет проверку правильности регулярных выражений, и кажется, что "[\\p{InArabic}&&\\PN]" для него очень странно. но вы знаете, что под ним просто красная линия. в компиляции и запуске у него нет никаких проблем. в любом случае спасибо дружище - person Elyas Hadizadeh; 08.05.2015

Вы можете использовать вычитание класса символов, что является довольно неясной функцией:

[\p{InArabic}&&[^۰-۹]]

Рабочий пример: http://ideone.com/jChGem

person Kobi    schedule 08.05.2015
comment
Привет, приятель, спасибо, к сожалению, твое регулярное выражение просто приемлемо в технологиях .Net, и я ищу язык программирования Java. - person Elyas Hadizadeh; 08.05.2015
comment
к сожалению, ваш отредактированный ответ не работает, понимаете? я думаю, что Java не поддерживает [^۰-۹], я не знаю :-?? - person Elyas Hadizadeh; 08.05.2015
comment
@ElyasHadizadeh - Странно... Кажется, у меня работает: ideone.com/jChGem . Не могли бы вы опубликовать свой код в вопросе? - person Kobi; 08.05.2015
comment
Вам также необходимо исключить диапазон [٠-٩], текущее регулярное выражение исключает только кодовые точки от U+06F0 до U+06F9. - person nhahtdh; 08.05.2015
comment
@nhahtdh - Разве это не тот диапазон, который у меня есть? Что мне не хватает? - person Kobi; 08.05.2015
comment
Диапазон, который я предложил [٠-٩], — это диапазон от U+0660 до U+0669. В вашем ответе его нет. - person nhahtdh; 08.05.2015
comment
@nhahtdh - О, понял. выглядит похоже. - person Kobi; 08.05.2015