ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Java中如何校验非法字符

Java中如何校验非法字符

校验名称或规格时,核心思路是用正则表达式匹配“非法字符”,只要匹配到就判定不通过。下面直接给你可用的写法。

✅ 正则校验:不允许出现逗号、换行、回车、空格

// 校验字符串是否包含非法字符(逗号、换行、回车、空格)publicstaticbooleancontainsIllegalChar(Stringinput){if(input==null){returntrue;// 或按需求返回 false}// 匹配逗号、换行符、回车符、空格Stringregex="[,\\n\\r ]";returninput.matches(".*"+regex+".*");}

关键点:matches()需要全量匹配,所以用.*包裹。如果返回true,说明包含非法字符。

✅ 更严谨:同时校验其他空白字符

如果想把制表符\t、Unicode 换行等也禁掉,可以用\\s:

// \\s 匹配所有空白字符:空格、制表符、换行、回车、换页等publicstaticbooleancontainsIllegalChar(Stringinput){if(input==null){returntrue;}Stringregex="[,\\s]";returninput.matches(".*"+regex+".*");}

✅ 推荐:用 Pattern 预编译(性能更好)

importjava.util.regex.Pattern;publicclassValidator{// 预编译正则,避免每次匹配都重新编译privatestaticfinalPatternILLEGAL_PATTERN=Pattern.compile("[,\\s]");publicstaticbooleanisValid(Stringinput){if(input==null||input.isEmpty()){returnfalse;}return!ILLEGAL_PATTERN.matcher(input).find();// find() 只要找到就返回 true}}

注意:这里用find()而不是matches(),find()只要字符串任意位置有匹配就返回true,更适合“只要包含就拒绝”的场景。

⚠️ 几个容易踩的坑

  1. Java 字符串里写正则,反斜杠必须双写:\\n、\\r、\\s,少写一个会编译报错或匹配不到。
  2. matches()是全量匹配,必须加.*才能匹配“包含”的情况;find()则不需要。
  3. 如果只是不想让中间有空格,但允许首尾有,需要单独处理trim();如果想完全禁止空格,用\\s更全面。

✅ 如果你用的是 Spring Boot 实体校验(@Valid)

可以用自定义注解,或者直接用@Pattern:

@Pattern(regexp="^[^,\\s]+$",message="名称不能包含逗号、空格或换行")privateStringname;

^[^,\\s]+$表示:整个字符串只能由非逗号、非空白字符组成,有一个都不行。

核心结论:用正则[,\\s]配合find()或matches()就能同时拦住逗号、空格、换行、回车;如果只想禁空格和逗号,用[,\\s]就够了,想连制表符也禁,\\s已经包含它了。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进