Java姓名正则验证问题:特定合法姓名无法通过匹配求助
解决姓名正则匹配问题:兼容带弯引号和复合姓氏的合法姓名
我写了一段Java代码用于验证用户姓名,符合规则就进入后续循环,不符合则退出。目前多数姓名能正常处理,但O’Malley, John F. 和 John O’Malley-Smith 这两个合法姓名被判定为无效。当前使用的正则是String REGEX = ("^[\\-\\.\\'\\, a-zA-Z ]*$");,尝试过\b边界符但没用,求修改正则的方案,附带合法/非法姓名列表及原代码。
合法姓名列表
- Bruce Schneier
- Schneier, Bruce
- Schneier, Bruce Wayne
- O’Malley, John F.
- John O’Malley-Smith
- Cher
非法姓名列表
- Ron O’’Henry(连续两个弯引号)
- Ron O’Henry-Smith-Barnes(多个连续连字符)
- L33t Hacker(含数字)
- //alert(“XSS”)//(含特殊符号和脚本内容)
- select * from users;(含SQL关键字和特殊符号)
修改后的正则方案
问题核心是原正则未包含Unicode弯引号(’),同时没有限制符号连续出现的情况。修改后的正则既能兼容合法姓名的特殊格式,又能过滤非法内容:
String REGEX = "^[a-zA-Z]+(?:[ ’\\-.,][a-zA-Z]+)*$";
正则解释
^[a-zA-Z]+:姓名开头必须是至少一个英文字母,避免以符号开头(?:[ ’\\-.,][a-zA-Z]+)*:允许后续出现零次或多次「符号+英文字母」组合,支持的符号包括空格、弯引号(’)、连字符(-)、点(.)、逗号(,)$:匹配到字符串结尾,确保整个姓名完全符合规则
完整修改后的代码
import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class InputAsker { public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); System.out.print("Please Input Your Name: "); String myName = keyboard.nextLine(); // 修改后的正则表达式 String REGEX = "^[a-zA-Z]+(?:[ ’\\-.,][a-zA-Z]+)*$"; Pattern pattern = Pattern.compile(REGEX); Matcher matcher = pattern.matcher(myName); boolean matchFound = false; // 改用matches()匹配整个字符串,避免部分匹配的误判 if (matcher.matches()) { System.out.println("That's A Great Name! Let's Continue"); matchFound = true; // 后续循环逻辑写在这里 } if (!matchFound) { System.out.println("Sorry, Not A Valid Name! Please Try Again!"); } keyboard.close(); // 关闭输入流,避免资源泄漏 } }
代码优化说明
- 把
matcher.find()替换为matcher.matches(),确保整个姓名字符串完全匹配规则,避免部分字符匹配导致的误判 - 添加
keyboard.close()关闭Scanner资源,符合Java资源管理规范 - 变量名
matchfound改为matchFound,遵循Java驼峰命名规范
内容的提问来源于stack exchange,提问作者Amelia Beard
相关产品推荐
相关产品推荐

