我使用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中的.*?效率不高,我使用了与principle of contrast相反的模式(\P{Lu}匹配任何不是Unicode大写字母的字符,\P{Ll}匹配任何不是Unicode小写字母的字符,等等).

如果您还需要支持任何Unicode数字,请将(?=[^0-9]*[0-9])替换为(?=\\P{Nd}*\\p{Nd}),其中\P{Nd}与Unicode数字以外的任何字符匹配,\p{Nd}与Unicode十进制数字以外的任何字符匹配.

Java相关问答推荐

取消按钮,但没有任何操作方法引发和异常

Jakarta CDI强制bean构造/注册遗留事件侦听器

在Spring Boot中使用哪个Java类来存储创建时间戳?

Com.google.firebase.database.DatabaseException:无法将类型为java.lang.Boolean的值转换为字符串.这是关于什么的?

JOOQ中的子查询使用的是默认方言,而不是配置的方言

为什么Spring Boot项目无法为基于MySQL的CRUD应用程序找到从JPARepository接口扩展的ProductRepository?

如何让JVM在SIGSEGV崩溃后快速退出?

SpringBoot Kafka自动配置-适用于SASL_PLAYTEXT的SSLBundle 包,带SCRAM-SHA-512

使用PDFBox从PDF中删除图像

try 在Android Studio中的infoWindow中使用EditText(Java)

在Java 15应用程序中运行Java脚本和Python代码

在使用具有不同成本的谓词调用allMatch之前对Java流进行排序会带来什么好处吗?

如何调整JButton的大小以适应图标?

如何制作回文程序?

当我将JTextField的getText函数与相等的String进行比较时;t返回true

如何在MPAndroidChart中的条形图上正确添加标签

如何正确使用java.time类?

如何在Java中正确实现填字游戏求解器

如何在 WebSphere Application Server 内的托管线程上运行 BatchEE 作业(job)?

Spring Boot 的 WelcomePageHandlerMapping 在无效的 API 路径上被调用,其中预期出现 404 错误