Intent Filter中匹配两段而非三段路径的实现问题
解决方案:使用正则模式精确匹配两段路径
你遇到的问题核心在于PatternMatcher.PATTERN_SIMPLE_GLOB的匹配规则限制——它的*会匹配任意字符序列(包括路径分隔符/),所以不管路径有多少段,只要满足开头的结构就会被匹配。而且你没法通过修改glob模式或路径来解决,那我们换个思路,用正则表达式模式来实现精确匹配。
修改后的代码
// 使用正则模式,精确匹配两段路径的格式:/分段/分段 PatternMatcher pm = new PatternMatcher("^/[^/]+/[^/]+$", PatternMatcher.PATTERN_REGEX); Boolean b = pm.match("/segment/segment"); // 返回 true Boolean c = pm.match("/segment/segment/segment"); // 返回 false AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); alertDialog.setTitle("Alert"); alertDialog.setMessage(b.toString() + ',' + c.toString());
为什么这个方案可行?
我们拆解下正则表达式^/[^/]+/[^/]+$的规则:
^:匹配字符串的开头/:匹配字面量斜杠[^/]+:匹配至少一个非斜杠的字符(也就是单个路径分段,不会包含/)$:匹配字符串的结尾
这样一来,只有刚好是/分段/分段格式的路径才会被匹配,更长的路径(比如三段)会因为结尾不满足$的限制而匹配失败。
为什么原来的SIMPLE_GLOB不行?
你之前用的/..*/..*其实存在两个问题:
- 在SIMPLE_GLOB模式中,
.是普通字面量字符,不是正则里的“任意字符”,所以这个模式其实是在匹配包含两个点的路径,你的测试路径能匹配成功完全是因为*匹配了segment(忽略了前面的两个点),这其实是不符合你原本意图的。 - 就算你改成正确的SIMPLE_GLOB模式
/*/*,它依然会匹配更长的路径——因为*会包含/,比如/segment/segment/segment会被拆分为/*匹配/segment/segment,/*匹配/segment,从而返回true。
所以切换到正则模式是最直接且符合你需求的解决方案。
内容的提问来源于stack exchange,提问作者Willy Pt
相关产品推荐
相关产品推荐

