我使用Regex来验证密码,密码至少包含8个字符,包括1个大写、1个小写、1个特殊字符和1个数值。我遇到的问题是,如果来自俄罗斯或任何其他语言与英语不同的国家的人试图使用默认键盘输入密码,这将给他们带来问题。
目前,我已经为我的应用程序设置了这个正则表达式条件:
String regex = "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$";
如果用户用英语设置密码,它就会起作用。但如果用户的语言不同,它就不起作用。(像Испытание@123
这样的密码将失败(。我在谷歌上搜索了俄罗斯regex的默认键盘,找到了俄罗斯键盘的解决方案。
我需要为所有不同的语言进行密码验证吗正则表达式?
是否有其他解决方案,以便我可以使用所需的密码验证来检查任何默认键盘布局的密码检查?
您可以使用p{Ll}
匹配任何Unicode小写字母,使用p{Lu}
匹配任何Unicode大写字母:
String regex = "^(?=\P{Lu}*\p{Lu})(?=\P{Ll}*\p{Ll})(?=[^0-9]*[0-9])(?=[^#?!@$%^&*-]*[#?!@$%^&*-]).{8,}$";
注意,lookahead中的.*?
不是有效的,我使用了相反的模式(P{Lu}
匹配任何不是Unicode大写字母的字符,P{Ll}
匹配任何非Unicode小写字母的字符等(,以符合对比原则。
如果您也需要支持任何Unicode数字,请将(?=[^0-9]*[0-9])
替换为(?=\P{Nd}*\p{Nd})
,其中P{Nd}
与Unicode数字以外的任何字符匹配,p{Nd}
与Unicode十进制数字以外的任意字符匹配。