为何Java正则匹配AWS Execute-API ARN返回NOT MATCHES?
问题原因及解决方案:通配符与正则表达式的混淆
你遇到的核心问题是把shell风格的通配符直接当成正则表达式使用了。Java的Pattern类解析的是标准正则表达式,而非通配符语法:
- 通配符里的
*代表匹配任意长度的任意字符; - 但正则表达式里的
*是量词,表示“匹配前面的字符零次或多次”,单独的*在这里会匹配零个或多个前面的://分隔符,完全不符合你的匹配预期。
修复方案
把通配符中的*替换为正则表达式里表示“任意字符序列”的.*,修改后的代码如下:
public static void main(String args[]) { String methodArn = "arn:aws:execute-api:eu-west-1:123456:foo/test/GET/user/info"; String permission = "arn:aws:execute-api:*:*:*/*/*/*"; // 将通配符*转换为正则的任意字符匹配逻辑 String regex = permission.replace("*", ".*"); Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(methodArn); if (matcher.matches()) { System.out.println("MATCHES"); } else { System.out.println("NOT MATCHES"); } }
执行这段代码会输出MATCHES,符合你的预期。
进阶:更精确的匹配
如果希望每个*仅匹配ARN各分段的内容(不跨:或/分隔符),可以把*替换为[^/:]*,这样每个通配符只会匹配分隔符之间的字符序列,避免意外的跨段匹配:
String regex = permission.replace("*", "[^/:]*");
内容的提问来源于stack exchange,提问作者asdasf
相关产品推荐
相关产品推荐

