Android 意图筛选器中的pathPattern匹配文字周期

Android 意图筛选器中的pathPattern匹配文字周期,android,android-intent,Android,Android Intent,我已经阅读了很多关于这个问题的其他SOs,特别是对这个问题的高度投票的答案: 我的方案比较简单-我只想匹配我们网站上的特定文件名-例如http://our_domain/filename.extn-但考虑到一些小的差异(我把它称为更进一步) 我已将我的意图过滤器编写如下: <data android:scheme="http" android:host="our_domain" android:pathPattern="/filename\\.extn" />

我已经阅读了很多关于这个问题的其他SOs,特别是对这个问题的高度投票的答案:

我的方案比较简单-我只想匹配我们网站上的特定文件名-例如
http://our_domain/filename.extn
-但考虑到一些小的差异(我把它称为更进一步)

我已将我的意图过滤器编写如下:

<data 
  android:scheme="http"
  android:host="our_domain" 
  android:pathPattern="/filename\\.extn" />

双重转义
\
,以便将其作为
\.
从XML中读取,从而转义句点,以便模式匹配器看到一个文本
,而不是“any”字符

在我的测试中,我编写了一个小应用程序,它从文本框中提取一个字符串,用给定的URI创建一个
ACTION\u视图
intent,然后启动它-然后检查浏览器是否启动,或者我是否看到一个选择器列出了我的应用程序

正确识别应用程序的确切路径-例如
http://our_domain/filename.extn
,但如果我将
替换为URI路径中有效的任何其他字符,也会识别它-例如,以下所有情况也会触发匹配:

  • http://our_domain/filename'extn
  • http://our_domain/filename~extn
  • http://our_domain/filenameaextn
最后一个是最令人担忧的

如何设置路径模式以确保只有文字句点匹配

请注意,我知道简单地使用
路径
而不是
路径模式
可能会起作用-但是,该模式还包含一些小的大小写不敏感-例如
F*F*ileN*n*ame
-我已经删除了这个问题的内容,因为它对这个周期匹配的行为没有影响


是否有可能仅匹配文字
字符实际上不受意图过滤系统的支持(不是设计而是bug),并且它们总是被视为“任何”?

仅凭猜测,您可以尝试(hack)将其包装在
[]
中,如下所示:
pattern=“filename[.]extn”
,所以你只接受以下列表中的角色:“.”-试一试

有很多其他的正则表达式游戏你可能会玩,但这是第一个想到的

是否可能只匹配文本。字符实际上不受意图过滤系统的支持(不是由设计而是由bug支持),它们总是被视为“任意”字符吗

是的,这看起来像是一个android bug。我刚刚浏览了android的源代码,这种行为(bug?)至今仍存在

也就是说,看起来匹配
文本只在一种情况下有效-当前面有
*
表达式时。只有这样才是正确的-
\\
才被考虑在内)。这就是为什么那些正在尝试的人能够使用这样的模式:

<data android:pathPattern=".*\\.ext" />

只要转义序列(
\\
)前面有
*
以外的内容,转义就被取消,点(
)将被视为通配符而不是文字,并匹配任何字符


我一直在考虑是否应该报告这个bug,但考虑到很少有人遇到它,这可能不值得。我寻找了类似的SO问题,但没有发现任何问题。此外,
通配符甚至没有作为有效的通配符出现在文档中。根据文档,唯一有效的通配符是
*
*

不幸的是,通常的正则表达式黑客无法工作-pathPattern逻辑甚至不是一个被裁减的正则表达式引擎-它只知道
*
(非贪婪)。