Как проверить номер ОАЭ на арабском языке с помощью RegEx?

func isValidUAENumber() -> Bool {
    let phoneRegExAr = "^(?:\\+٩٧١|٠(٠٩٧١)?)(?:[٢٣٤٦٧٩]|٥[٠١٢٥٦])[٠-٩]{٧}$"
    let phoneRegEx = "^(?:\\+971|0(0971)?)(?:[234679]|5[01256])[0-9]{7}$"
    let isArabic = true //(or false based on some condition)
    let useRegEx = isArabic ? phoneRegExAr : phoneRegEx
    let phonePredicate = NSPredicate(format:"SELF MATCHES %@", useRegEx)
    return phonePredicate.evaluate(with: self)
}

Таким образом, этот код отлично работает с номерами ОАЭ на английском языке, и теперь я пытаюсь проверить то же самое с номерами ОАЭ на арабском языке. Мой разум предложил мне преобразовать английские числа RegEx в арабские числа RegEx, поэтому я использовал онлайн-инструмент для перевода, чтобы преобразовать английские числа в арабские числа, и здесь у меня есть арабские числа RegEx, но приложение выйдет из строя, поскольку я использовал арабское регулярное выражение для проверки наличия действительный номер ОАЭ на арабском языке:

*** Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Не удается выполнить сопоставление регулярных выражений, причина: невозможно открыть шаблон U_REGEX_BAD_INTERVAL (строка +٩٧١٥٢٥٣٩٥٧٥٧, шаблон ^(?:+٩٧١|٠(٠٩٧١)?) (?:[٢٣٤٦٧٩]|٥[٠١٢٥٦])[٠-٩]{٧}$, случай 0, канон 0)'

Кто-нибудь уже сталкивался с такой ситуацией? Пожалуйста помоги.

Обновление 1:

Вот как арабский RegEx выглядит в Xcode? введите здесь описание изображения

Примерные номера:

  1. 072466666 (٠٧٢٤٦٦٦٦٦)
  2. +97172466666 (+٩٧١٧٢٤٦٦٦٦٦)

Вы можете преобразовать их в арабские числа для проверки?

Обновление 2:

После использования RegEx ("^(?:\\+٩٧١|٠(٠٩٧١)?)(?:[٢٣٤٦٧٩]|٥[٠١٢٥٦])[٠-٩]{7}$"), предоставленного rmaddy, он перестал падать, но по-прежнему не определяет, является ли это допустимым числом или нет.


person Hemang    schedule 20.09.2018    source источник
comment
{7} должен оставаться {7} в арабском выражении, и он должен оставаться после эквивалента [0-9].   -  person rmaddy    schedule 20.09.2018
comment
Вы также перевернули слишком много регулярного выражения. Вы должны поддерживать синтаксис регулярных выражений в правильном порядке. Просто измените порядок, в котором может стоять каждая часть числа.   -  person rmaddy    schedule 20.09.2018
comment
@rmaddy, я не знал, но порядок изменился автоматически. Постараюсь исправить и еще раз проверю. Знаете ли вы какой-нибудь онлайн-инструмент, чтобы сделать это легко?   -  person Hemang    schedule 20.09.2018
comment
Я придумал let phoneRegExAr = "^(?:\\+٩٧١|٠(٠٩٧١)?)(?:[٢٣٤٦٧٩]|٥[٠١٢٥٦])[٠-٩]{7}$", но, поскольку вы не предоставили никаких тестовых примеров в своем вопросе, я не могу его проверить. (Это не так, как это выглядит в Xcode).   -  person rmaddy    schedule 20.09.2018
comment
Спасибо @rmaddy, позвольте мне проверить это. Если это сработает, я попрошу вас написать ответ, чтобы я мог принять.   -  person Hemang    schedule 20.09.2018
comment
@rmaddy, пожалуйста, проверьте скриншот, о котором идет речь, я не знаю, но StackOverflow изменил то, как я пишу это в Xcode. Итак, мой RegEx такой же, как ваш. Я ничего не изменил. Позвольте мне дать вам несколько тестовых номеров, которые вы можете проверить? Я обновлю цифры в своем вопросе.   -  person Hemang    schedule 20.09.2018
comment
Моя РЭ не такая. См. мой первый комментарий и RE, который я разместил.   -  person rmaddy    schedule 20.09.2018
comment
О да, извините за это. Я пропустил его. Сейчас я проверю ваш RegEx. Спасибо.   -  person Hemang    schedule 20.09.2018
comment
@rmaddy, я обновил вопрос (не могли бы вы проверить обновление-2)?   -  person Hemang    schedule 20.09.2018
comment
RE, который у меня есть в Xcode, отлично работает с двумя опубликованными вами примерами. Но когда я копирую и вставляю RE из Xcode в эти комментарии, все портится. Должна быть какая-то проблема с RTL/LTR.   -  person rmaddy    schedule 20.09.2018
comment
ваш Regex работал, проверьте этот тест regex101.com/r/oSa3bN/1   -  person a.masri    schedule 20.09.2018
comment
@Ахмед, спасибо! как-то это не работает для меня прямо сейчас.   -  person Hemang    schedule 20.09.2018
comment
@rmaddy, я прошу вас добавить свои комментарии в качестве ответа, чтобы я мог его принять. Я считаю, раз это работает у вас, ребята, то должно работать и у меня. Я проверю их позже.   -  person Hemang    schedule 20.09.2018
comment
Я пытался несколько раз, но я не мог. Моя попытка скопировать и вставить или ввести RE в ответ ниже привела к искаженному беспорядку, отсюда и мой предыдущий комментарий.   -  person rmaddy    schedule 20.09.2018
comment
Проблема исправлена? Обратите внимание, что лучше сопоставлять эти цифры с помощью единиц кода Unicode, например \uXXXX.   -  person Wiktor Stribiżew    schedule 22.11.2018
comment
Да, проблема была исправлена. Мне нужно было изменить порядок арабских чисел.   -  person Hemang    schedule 22.11.2018


Ответы (1)


Там описан арабский шрифт в Unicode (источник: Википедия) и диапазон от U+0600 до U+06FF поэтому регулярное выражение, например:

([\u0600-\u06FF]+)

Должно сработать. И это так (Regex101). Только для цифр используйте диапазон от U+0660 до U+0669.

person Nikolas Charalambidis    schedule 20.09.2018