我已经阅读了很多关于此问题的其他文章 - 特别是对这个问题的高度评价答案:Android intent filter for a particular file extension?
我的情况稍微简单一点 - 我只想匹配我们网站上的特定文件名 - 例如http://our_domain/filename.extn
- 但考虑到案件中的一些微小差异(我将其进一步调低)。
我写了我的意图过滤器如下:
<data
android:scheme="http"
android:host="our_domain"
android:pathPattern="/filename\\.extn" />
双重转义\
,以便将其作为\.
从XML中读出,从而转义句点,以便模式匹配器看到文字.
而不是'{任何'角色。
对于我的测试,我编写了一个小应用程序,它从文本框中获取字符串,使用给定的URI创建ACTION_VIEW
意图,然后启动它 - 然后检查浏览器是否启动或是否启动我看到列出了我的应用的选择器。
正确识别应用程序的确切路径 - 例如http://our_domain/filename.extn
,但如果我将.
替换为URI路径中有效的任何其他字符,也会被识别出来 - 例如,以下所有内容也会触发匹配:
http://our_domain/filename'extn
http://our_domain/filename~extn
http://our_domain/filenameaextn
最后一个是最令人担忧的!
如何设置路径模式以确保仅一个文字句点匹配?
请注意 ,我知道只使用path
代替pathPattern
可能会有效 - 但是,该模式还包含一些小的不敏感 - 例如F*f*ileN*n*ame
- 我已经删除了这个问题的内容,因为它对这个句点匹配的行为没有任何影响。
是否有可能匹配仅文字.
字符实际上不被意图过滤系统支持(不是设计而是错误),并且它们将始终被处理作为'任何'?
答案 0 :(得分:1)
是否可能只匹配文字。意图过滤器系统实际上不支持这些字符(不是通过设计而是通过错误),并且它们将始终被视为“任意”吗?
是的,这看起来像是一个Android错误。我刚刚浏览了Android PatternMatcher的源代码,并且这种行为(错误?)一直存在到今天。
即看起来匹配.
文字仅在一种情况下有效-当它前面带有*
表达式时。只有这样,才能正确考虑escaped in code-\\
。这就是为什么尝试match a file extension的人能够使用这样的模式的原因:
<data android:pathPattern=".*\\.ext" />
在转义序列(\\
之前加上*
以外的其他字符时,转义为not taken into account,并且点(.
)被视为通配符而不是文字,并且可以匹配任何字符。
我一直在考虑是否应该报告此错误,但考虑到很少有人遇到此错误,这可能不值得。我寻找了类似的SO问题,但没有找到任何问题。另外,documentation中甚至没有提到.
通配符。根据文档,唯一有效的通配符是.*
和*
。
答案 1 :(得分:0)
在这里猜测,您可以尝试(hack)将其包装在[]
中,如下所示:pattern="filename[.]extn"
,因此您只接受以下列表中的字符:“。” - 试一试?
你可能会玩很多其他的正则表达式游戏,但这是第一个浮现在脑海中的游戏。