Java中检查字符串是否含非法字符需先定义非法字符范围,再通过正则匹配(如Pattern.find)、遍历比对(如Set.contains)或工具类实现;正则推荐用matches或matcher.find,白名单校验更安全。

在 Java 中检查字符串是否包含非法字符,核心思路是:明确哪些字符是“非法”的,然后判断字符串中是否存在这些字符。常见做法有正则匹配、遍历比对、或使用 Apache Commons Lang 等工具类。
定义非法字符范围
非法字符取决于具体业务场景。例如:
- 文件名校验:禁止
/ : * ? " < > | - SQL/脚本防注入:过滤
'; "-- /* */等 - 纯英文+数字+下划线:只允许
[a-zA-Z0-9_] - 中文用户名:可能只允许汉字、字母、数字、短横线和下划线
用正则表达式快速判断(推荐)
使用 String.matches() 或 Pattern 检查是否**不匹配合法模式**,或直接查找非法字符。
示例:检查字符串是否含 Windows 文件名非法字符
立即学习“Java免费学习笔记(深入)”;
String illegalPattern = "[\\/:*?"<>|]";
boolean hasIllegal = str.matches(".*" + illegalPattern + ".*");
// 或更高效:用 find() 避免全串匹配
boolean hasIllegal = Pattern.compile(illegalPattern).matcher(str).find();
如果只允许字母、数字、下划线、中文:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
String validPattern = "^[\u4e00-\u9fa5a-zA-Z0-9_]+$"; boolean isValid = str.matches(validPattern); // 注意:空字符串会返回 false
遍历字符逐个判断(适合简单规则或性能敏感场景)
对每个 char 调用 Character.isXXX() 或查白名单/黑名单 Set。
Set<Character> illegalChars = Set.of('\', '/', ':', '*', '?', '"', '<', '>', '|');
boolean hasIllegal = str.chars().mapToObj(c -> (char) c)
.anyMatch(illegalChars::contains);
或者手动循环(更直观,避免装箱):
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c == '\' || c == '/' || c == ':' || c == '*' || c == '?' ||
c == '"' || c == '<' || c == '>' || c == '|') {
return true; // 发现非法字符
}
}
借助工具类(如 Apache Commons Lang)
若项目已引入 commons-lang3,可用 StringUtils 辅助判断:
// 检查是否只包含指定字符集(相当于白名单) boolean isValid = StringUtils.containsOnly(str, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"); <p>// 或用 containsAny 检查是否含任意非法字符(需先构造非法字符字符串) String illegalStr = "/:*?"<>|"; boolean hasIllegal = StringUtils.containsAny(str, illegalStr);
注意:containsAny 是 任意一个匹配即返回 true,语义清晰,适合黑名单场景。
不复杂但容易忽略的是:要区分“包含非法字符”和“是否完全合法”,前者用黑名单+find,后者用白名单+matches 更稳妥。同时注意空字符串、null 值的处理,建议提前判空。

















