如何校验请求中特定格式String参数的合法性
解决方案:用正则表达式精准校验格式
只靠contains("-")只能做最基础的判断,要覆盖所有非法场景,直接用正则表达式做全量校验是最高效的方式,具体步骤如下:
先明确合法格式的核心规则(从你给出的示例推导):
- 字符串必须被
-分割为恰好4个非空片段 - 片段1:至少1位数字(比如
1、25) - 片段2:至少2位大写英文字母(比如
BB、GG) - 片段3:可以是至少1位数字(比如
94)或至少2位大写英文字母(比如JJ) - 片段4:至少1位数字(比如
675757、656) - 不能以
-开头或结尾,也不能出现连续-
- 字符串必须被
对应正则表达式:
^\d+-[A-Z]{2,}-(?:[A-Z]{2,}|\d+)-\d+$简单解释:
^和$:限定匹配整个字符串,避免部分匹配\d+:匹配1位及以上数字[A-Z]{2,}:匹配2位及以上大写英文字母(?:[A-Z]{2,}|\d+):非捕获分组,同时支持片段3的两种合法格式
替换原有判断逻辑:
把原来的contains判断换成正则匹配,代码示例:String param = getExVariable(); Pattern pattern = Pattern.compile("^\\d+-[A-Z]{2,}-(?:[A-Z]{2,}|\\d+)-\\d+$"); Matcher matcher = pattern.matcher(param); if (!matcher.matches()) { return error; }能覆盖的所有非法场景:
- 不含
-的字符串(如FF5544335) - 分割后片段数不为4的(如
25-JJ-94) - 以
-开头/结尾的(如44-BB-、-1-BB-JJ-675757) - 片段格式不符合要求的(如
1-bb-JJ-675757小写字母、1-B-JJ-675757单个字母)
- 不含
如果你的格式规则有微调(比如片段3允许单个字母、片段1固定1位数字),只需要修改正则里的对应部分即可。
内容的提问来源于stack exchange,提问作者Kevin Johnson
相关产品推荐
相关产品推荐

