Java中使用正则表达式匹配指定格式路径的问题
正则匹配路径问题解决
你的需求是匹配格式为 secret/roles/[任意内容]/dev/[指定变量]/[可选子路径] 的路径,原正则失效的核心问题是用了太多可选匹配符 ?,导致/dev/[变量]这一关键过滤段变成可选,自然会捕获到secret/roles下所有子路径。
修正后的正则代码
String Variable = "john"; // 用Pattern.quote处理变量,避免变量含特殊字符时出错 String regularExpression = "^secret/roles/[a-zA-Z0-9_.-]+/dev/" + Pattern.quote(Variable) + "(?:/[a-zA-Z0-9_.-]+)*/?$";
正则各部分说明
^secret/roles/:强制路径以该前缀开头,锚定匹配起始位置[a-zA-Z0-9_.-]+:匹配secret/roles/之后、/dev/之前的任意路径段(至少1个字符,支持字母、数字、下划线、点、横杠)/dev/:强制路径中必须包含该固定段Pattern.quote(Variable):将变量转为正则安全的字符串,避免变量含.、*等特殊字符时破坏正则逻辑(?:/[a-zA-Z0-9_.-]+)*:匹配0个或多个后续子路径段,(?:...)是非捕获组,不额外存储匹配结果/?$:允许路径末尾有一个可选的/,锚定匹配结束位置
原正则的问题点
原代码中(secret/roles)?、(/dev)?、(/"+Variable+")?都用了?,意味着这些段都可以不存在,正则会匹配比如secret/roles/test、secret/roles/test/dev这类不符合要求的路径,完全起不到过滤变量部分的作用。
内容的提问来源于stack exchange,提问作者Good Panic
相关产品推荐
相关产品推荐

