swift 从给定正则表达式匹配中排除德语元音变音

brccelvz  于 2023-06-21  发布在  Swift
关注(0)|答案(2)|浏览(77)

我有一个密码匹配要求,我不想在密码验证中包括德语元音变音。当前匹配标准为:
1.一个小写
1.一个大写字母
1.一位数
1.最少10个字符
我创建了一个regex如下:

func matchPasswordWith(_ text: String) -> Bool {
    let predicate = NSPredicate(format: "SELF MATCHES %@","^(?=.*?[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{10,}$")
    return predicate.evaluate(with: text)
}

但是当用户输入任何元音变音(e.g. ü,ä,ī,ß)时,上面的正则表达式返回true,但我想排除元音变音匹配。
请指出我在这里做错了什么。

mqkwyuun

mqkwyuun1#

您可以使用 * 字符类交集 * 对 * 字符类 * 中的值求反。
语法是&&[],必须放在 character class 的末尾。
此外,你可以减少你的模式。

(?i)^[a-z\d&&[^äöüÄÖÜß]]{10,}$

(?i)将切换到不区分大小写模式。
这里有一些例子。
这些会匹配。

abcdefghij
1234567890
AbCdE12345

而且,这些不会。

äbcdefghij
12345
ÄbCdE12345
pokxtpni

pokxtpni2#

您可以在密码匹配中排除变音符号,方法是包含所有您希望包含的非变音符号字符。将(?=.*[a-zA-Z]).{10,}$替换为类似[A-Za-z0-9]{10,}$的内容

func matchPasswordWith(_ text: String) -> Bool {
    let predicate = NSPredicate(format: "SELF MATCHES %@","^(?=.*?[0-9])(?=.*[a-z])(?=.*[A-Z])[A-Za-z0-9]{10,}$")
    return predicate.evaluate(with: text)
}

[A-Za-z0-9]{10,}检查所有字符是否为字母或数字,并且至少有10个字符。显然,它也排除了其他特殊字符,但您可以始终将这些字符添加到字符集中,例如:[A-Za-z0-9@#$%^&*]{10,} .或者你想包含的任何其他字符。

相关问题