我想验证密码是否包含至少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
}
请提前告知错误,
答案 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-9
,A-Z
和阿拉伯文字。另请注意,为了匹配任何字母,您可以使用a-z
并匹配您可能使用的任何数字\p{L}
(它们在ICU库中具有Unicode识别功能)。所以,*如果字母或数字是阿拉伯语,英语,希腊语或其他什么t无关紧要,你可以使用
\d