正则匹配校验输入失效求助:如何正确校验6个0-99的数字?
问题分析与修复
你的代码问题出在校验顺序和正则逻辑错误:
- 第一个正则
^(?!\\s)\\d{1,2}( \\d{1,2})*(?!\\s)$同时校验了「首尾无空格」和「所有数字是1-2位」,当输入包含三位数时,这个正则直接不匹配,触发首尾空格的错误提示,根本没机会走到数字范围的校验分支。 - 第二个正则
^(\\d{1,2} ){5}\\d{1,2}$强制要求数字之间只能是单个空格,不符合你「1个或多个空格分隔」的需求。
修复方案(分步校验,易读易维护)
把校验拆分成独立步骤,按逻辑顺序执行:
public String validateInput(String numbers) { // 检查输入为空 if (numbers == null || numbers.isEmpty()) { return "Error: Input cannot be empty"; } // 检查首尾是否有空格 if (numbers.startsWith(" ") || numbers.endsWith(" ")) { return "Error: Cannot have spaces before the first number or after the last number"; } // 按1个或多个空格分割数字 String[] nums = numbers.split("\\s+"); // 检查是否恰好6个数字 if (nums.length != 6) { return "Error: Must input exactly 6 numbers"; } // 检查每个数字是否在0-99之间 for (String numStr : nums) { int num; try { num = Integer.parseInt(numStr); } catch (NumberFormatException e) { return "Error: All inputs must be valid integers"; } if (num < 0 || num > 99) { return "Error: All numbers must be between 0 and 99 inclusive"; } } // 所有校验通过 return ""; }
修复说明
- 用
startsWith/endsWith替代正则检查首尾空格,逻辑更直观,避免正则匹配的歧义。 - 分割字符串后先检查数字数量是否为6,明确提示数量错误。
- 逐个解析数字并检查范围,能精准定位到数字越界的问题,同时捕获非整数输入的情况。
可选:正则校验方案(单一正则匹配所有条件)
如果你坚持用正则一次性匹配所有规则,可以用这个正则:^\\d{1,2}(?:\\s+\\d{1,2}){5}$,但这种方式无法区分不同类型的错误(比如是数量不对还是数字越界),适合只需要判断合法/非法的场景:
public String validateInput(String numbers) { if (numbers == null || numbers.isEmpty()) { return "Error: Input cannot be empty"; } // 匹配6个0-99的数字,中间用1+空格分隔,首尾无空格 if (!numbers.matches("^\\d{1,2}(?:\\s+\\d{1,2}){5}$")) { // 这种方式无法细分错误类型,只能给出通用提示 return "Error: Input must be 6 numbers (0-99) separated by one or more spaces, no leading/trailing spaces"; } // 额外检查数字范围(因为正则只能匹配位数,09这种格式parseInt后是9,不影响结果,但严格场景可保留) String[] nums = numbers.split("\\s+"); for (String numStr : nums) { int num = Integer.parseInt(numStr); if (num < 0 || num > 99) { return "Error: All numbers must be between 0 and 99 inclusive"; } } return ""; }
内容的提问来源于stack exchange,提问作者Zach
相关产品推荐
相关产品推荐

