使用正则表达式进行密码验证swift中的阿拉伯语和英语字符

时间:2018-04-27 08:18:23

标签: ios swift regex

我想验证密码是否包含至少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
}

然后我找到this answer阿拉伯字符和数字,然后我尝试合并这两个:

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

请提前告知错误,

1 个答案:

答案 0 :(得分:1)

由于英语或阿拉伯语字母正则表达式(如您所链接的this answer中所述,另请参阅this answer, too)为[a-zA-Za-z\u0621-\u064A]且英语或阿拉伯数字正则表达式为{{1}你可以使用

[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,}$" ^锚点,因为$要求模式匹配整个字符串输入。

将一个阿拉伯字母与Swift中使用的ICU正则表达相匹配的另一种方法是使用MATCHES(它是一个字符类内的交集,它匹配任何字母但来自阿拉伯字符集)。与数字相同:[\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,}$" - 任何字母,但它应该属于ASCII字母或阿拉伯字母
  • [\\p{L}&&[\\p{script=Arabic}A-Za-z]] - 来自[\\p{N}&&[\\p{script=Arabic}0-9]]范围或阿拉伯文字
  • 的任何数字
  • 0-9 - 任何字母或数字,但仅限于ASCII [\\p{L}\\p{N}&&[\\p{script=Arabic}a-zA-Z0-9]]0-9A-Z和阿拉伯文字。

另请注意,为了匹配任何字母,您可以使用a-z并匹配您可能使用的任何数字\p{L}(它们在ICU库中具有Unicode识别功能)。所以,*如果字母或数字是阿拉伯语,英语,希腊语或其他什么t无关紧要,你可以使用

\d