You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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不行?

你之前用的/..*/..*其实存在两个问题:

  1. 在SIMPLE_GLOB模式中,.是普通字面量字符,不是正则里的“任意字符”,所以这个模式其实是在匹配包含两个点的路径,你的测试路径能匹配成功完全是因为*匹配了segment(忽略了前面的两个点),这其实是不符合你原本意图的。
  2. 就算你改成正确的SIMPLE_GLOB模式/*/*,它依然会匹配更长的路径——因为*会包含/,比如/segment/segment/segment会被拆分为/*匹配/segment/segment,/*匹配/segment,从而返回true。

所以切换到正则模式是最直接且符合你需求的解决方案。

内容的提问来源于stack exchange,提问作者Willy Pt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:11:42