如何通过正则表达式预验证多段[constant://xxx;N]结构的字符串,排除业务异常格式
如何通过正则表达式预验证多段
[constant://xxx;N]结构的字符串,排除业务异常格式 嗨~看起来你遇到的问题是当前的正则只会匹配符合规则的片段,但没法约束整个字符串的边界,导致像外层多套括号这种业务上无效的格式被放过对吧?别担心,我们可以通过一个锚定整个字符串的预验证正则来解决这个问题,先确保整个输入完全符合业务要求,再执行后续的解析逻辑。
核心思路
预验证的关键是用^(字符串开头)和$(字符串结尾)锚定整个输入,确保整个字符串只能由一个或多个合法的[constant://xxx;N]片段组成,没有任何多余的前缀、后缀或嵌套包裹。
预验证正则与代码实现
这里给你适配Kotlin的完整代码,先做预验证,验证通过再解析:
fun validateAndParseConstantLinks(gpLinkValue: String) { // 预验证正则:确保整个字符串由1个或多个合法片段组成 val validationPattern = Pattern.compile( "^(\\[constant://[^;\\]]+;[0-3]\\])+$", Pattern.CASE_INSENSITIVE ) // 先做预验证,不匹配直接抛异常 if (!validationPattern.matcher(gpLinkValue).matches()) { throw IllegalArgumentException("输入格式不符合要求,只允许由一个或多个[constant://xxx;N]片段拼接") } // 预验证通过后,执行原有的解析逻辑 val parsePattern = Pattern.compile( "\\[constant://([^;]+);([0-3])]", Pattern.CASE_INSENSITIVE ).matcher(gpLinkValue) while (parsePattern.find()) { val part1 = parsePattern.group(1) val part2 = parsePattern.group(2).toLong() doSomeStuff(part1, part2) } } // 示例调用 fun main() { // 合法输入:正常解析 validateAndParseConstantLinks("[constant://foo;0][constant://bar;3]") // 非法输入:会抛出异常(外层多了括号) // validateAndParseConstantLinks("[[constant://foo;0][constant://bar;3]]") }
正则细节解释
预验证正则
^(\\[constant://[^;\\]]+;[0-3]\\])+$^和$:强制匹配整个字符串,杜绝任何多余字符(比如外层的额外括号、首尾空格等)\\[constant://:匹配片段开头的固定标识[constant://[^;\\]]+:匹配xxx部分,确保不会匹配到分号;或闭合括号](避免提前结束片段);[0-3]:匹配分号加0-3的合法数字(和你原逻辑一致)\\]:匹配片段的闭合括号]+:允许上述合法片段重复1次或多次
解析正则的小优化
把原逻辑里的[^;]*改成了[^;]+,确保part1(即xxx部分)至少有内容,如果业务允许空值,可以改回*。
边界测试案例
- ✅ 合法输入:
[constant://foo;0]、[constant://foo,bar;3][constant://test;1] - ❌ 非法输入:
[[constant://foo;0][constant://bar;3]](外层多套括号)[constant://foo;0]abc(末尾有多余字符)[constant://foo;4](数字超出0-3范围)[constant://foo;](缺少数字部分)
备注:内容来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

