Java注册界面用户名正则校验失效,合法输入被判定非法求助
问题分析与解决
核心问题:用户名正则规则不支持大写字母
你输入的用户名是Bababa(包含大写字母),但你的用户名正则^[a-z0-9_-]{5,12}(?!\\\\s)$只允许小写字母、数字、下划线、短横线,所以直接匹配失败,触发"Invalid Username"提示。
正则与校验逻辑的其他问题
- 多余的负前瞻写法:末尾的
(?!\\\\s)$完全没必要,^...$已经是整串匹配,只要字符集里不包含空格,就不会允许空格出现在用户名里,这个写法反而容易引入错误。 - 错误的校验方法:你用
matcher.find()做校验,它只会查找字符串中是否有匹配的子串,而不是检查整串是否完全符合规则。比如输入Bababa(前后带空格),find()会匹配到中间的Bababa,但实际上这是无效的用户名,应该用matches()来强制整串匹配。
修正方案
- 修改用户名正则:加入大写字母支持,或者启用不区分大小写模式
- 允许大小写字母的正则:
Pattern reUser = Pattern.compile("^[a-zA-Z0-9_-]{5,12}$"); - 启用不区分大小写模式(正则只写小写,编译时加标志):
Pattern reUser = Pattern.compile("^[a-z0-9_-]{5,12}$", Pattern.CASE_INSENSITIVE);
- 允许大小写字母的正则:
- 替换校验方法:把所有
matcher.find()改成matcher.matches(),确保整串符合规则 - 优化密码不匹配的提示:最后一个else分支是密码不匹配的情况,建议把提示改成"Passwords do not match",更准确
修正后的核心代码示例
if ( nameLargeButton.equals("Sign-in")){ String user = username[1].getText(); char[] passChars = password[1].getPassword(); String pass = new String(passChars); char[] cfPassChars = confirmPassInput.getPassword(); String cfPass = new String(cfPassChars); // 修正后的正则规则 Pattern reUser = Pattern.compile("^[a-zA-Z0-9_-]{5,12}$"); Pattern rePass = Pattern.compile("^.{6,}$"); if(e.getSource() == largeButton){ boolean userValid = reUser.matcher(user).matches(); boolean passValid = rePass.matcher(pass).matches(); boolean passMatch = pass.equals(cfPass); if (userValid && passValid && passMatch) { JOptionPane.showMessageDialog(null, "Success", "Thông báo", JOptionPane.WARNING_MESSAGE); } else if (!userValid){ JOptionPane.showMessageDialog(null, "Invalid Username", "Thông báo", JOptionPane.WARNING_MESSAGE); resetLoginDialog(); } else if (!passValid){ JOptionPane.showMessageDialog(null, "Invalid Password", "Thông báo", JOptionPane.WARNING_MESSAGE); } else { JOptionPane.showMessageDialog(null, "Passwords do not match", "Thông báo", JOptionPane.WARNING_MESSAGE); } } }
内容的提问来源于stack exchange,提问作者user23884438
相关产品推荐
相关产品推荐

