
本文介绍如何使用正则表达式安全地从形如 "1a"、"34f" 的字符串中分离整数和字母部分,并分别校验其是否落在指定范围(整数 1–34,字母 a–f)内,避免 numberformatexception 等异常。
本文介绍如何使用正则表达式安全地从形如 "1a"、"34f" 的字符串中分离整数和字母部分,并分别校验其是否落在指定范围(整数 1–34,字母 a–f)内,避免 numberformatexception 等异常。
要正确处理类似 "35A" 或 "100B" 这类混合字符串(前缀为数字、后缀为单个大写字母),关键在于不直接调用 Integer.parseInt() 全局解析整个字符串——因为 "35A" 不是合法整数,会立即抛出 NumberFormatException。正确的做法是:先通过正则表达式精准匹配并分组提取数字和字母部分,再分别校验。
✅ 推荐方案:正则匹配 + 分组提取 + 范围校验
使用正则表达式 "(\d{1,2})([A-F])" 可精确匹配:
-
\d{1,2}:1 或 2 位数字(覆盖 1–34,且排除 0 或 100+ 等无效前置); -
[A-F]:严格限定单个大写英文字母 A 到 F; - 括号形成两个捕获组:
group(1)是数字字符串,group(2)是字母。
以下是完整、健壮的验证示例:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RangeValidator {
private static final Pattern PATTERN = Pattern.compile("(\d{1,2})([A-F])");
public static boolean isValid(String input) {
if (input == null || input.trim().isEmpty()) {
return false;
}
Matcher matcher = PATTERN.matcher(input.trim());
if (!matcher.matches()) { // 注意:用 matches() 确保全字符串匹配,而非 find()
return false;
}
try {
int number = Integer.parseInt(matcher.group(1));
String letter = matcher.group(2);
return number >= 1 && number <h3>⚠️ 注意事项</h3>
-
务必使用
matcher.matches()(而非find()),确保整个输入字符串完全符合模式,防止"123A"(数字超长)或"12AB"(字母超长)被误判; - 若需支持小写字母(如
"a"–"f"),可改用Pattern.CASE_INSENSITIVE标志,或扩展正则为"([a-fA-F])"; -
\d{1,2}允许"1"到"99",但后续逻辑仍需校验1–34,这是语义层面的约束,不可省略; - 输入为空、null 或含空格时应提前处理(示例中已用
trim()和空检查); - 不建议在
parseInt外层套try-catch来“兜底”——这掩盖了设计缺陷;正则先行过滤才是面向失败的设计。
该方法兼顾安全性、可读性与扩展性,是处理结构化字符串范围校验的标准实践。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










