Проверка пароля с помощью регулярных выражений арабских и английских символов в swift - PullRequest
0 голосов
/ 27 апреля 2018

Я хочу подтвердить пароль, включив по крайней мере 1 арабскую или английскую букву и по крайней мере 1 арабскую или английскую цифру и пароль длиной не менее 8, мой старый код, который был сделан только для английского языка, был похож на:

let passwordRegex = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$"
if (!NSPredicate(format:"SELF MATCHES %@",passwordRegex).evaluate(with: password)){
    return false
}

и затем я нашел этот ответ для арабских символов и цифр, затем я попытался объединить оба варианта так:

let passwordRegex = "^(?=.*[A-Za-zء-ي])(?=.*٠-٩\\d)[A-Za-zء-ي٠-٩\\d]{8,}$"
if (!NSPredicate(format:"SELF MATCHES %@",passwordRegex).evaluate(with: password)){
    return false
}

посоветуйте пожалуйста что не так, заранее спасибо

1 Ответ

0 голосов
/ 27 апреля 2018

Поскольку регулярное выражение для английской или арабской буквы (как описано в в этом ответе , на которое вы ссылались, см. Также в этом ответе ) равно [a-zA-Za-z\u0621-\u064A] и английской или арабской цифре регулярное выражение [0-9\u0660-\u0669] вы можете использовать

let passwordRegex = "^(?=.*[a-zA-Z\\u0621-\\u064A])(?=.*[0-9\\u0660-\\u0669])[a-zA-Za-z\\u0621-\\u064A0-9\\u0660-\\u0669]{8,}$"

ПРИМЕЧАНИЕ: вам не нужны внешние ^ и $ якоря, потому что MATCHES требует, чтобы шаблон совпадал со всем вводом строки.

Другой способ сопоставить арабскую букву с регулярным выражением ICU, используемым в Swift, - использовать [\p{L}&&[\p{script=Arabic}]] (это пересечение внутри класса символов, оно соответствует любой букве, кроме арабского набора символов). То же самое с цифрой: [\p{N}&&[\p{script=Arabic}]]. Тогда регулярное выражение будет выглядеть как

let passwordRegex = "^(?=.*[\\p{L}&&[\\p{script=Arabic}A-Za-z]])(?=.*[\\p{N}&&[\\p{script=Arabic}0-9]])[\\p{L}\\p{N}&&[\\p{script=Arabic}a-zA-Z0-9]]{8,}$"

Итак, вот

  • [\\p{L}&&[\\p{script=Arabic}A-Za-z]] - любая буква, но она должна принадлежать либо буквам ASCII, либо арабскому алфавиту
  • [\\p{N}&&[\\p{script=Arabic}0-9]] - любая цифра, кроме диапазона 0-9 или арабского алфавита
  • [\\p{L}\\p{N}&&[\\p{script=Arabic}a-zA-Z0-9]] - любая буква или цифра, но только из ASCII 0-9, A-Z, a-z и арабского алфавита.

Обратите внимание, что для сопоставления любых букв вы можете использовать \p{L} и для сопоставления любых цифр, которые вы можете использовать \d (они поддерживают Unicode в библиотеке ICU). Итак, * если t не имеет значения, являются ли буквы или цифры арабскими, английскими, греческими или какими-либо другими, вы можете использовать

let passwordRegex = "^(?=.*\\p{L})(?=.*\\d)[\\p{L}\\d]{8,}$"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...