2

我已经阅读了很多其他关于此的 SO - 特别是对这个问题的高度投票回答:Android Intent filter for a specific file extension?

我的场景稍微简单一些——我只是想匹配我们网站上的特定文件名——例如http://our_domain/filename.extn——但考虑到一些小的差异以防万一(我在下面进一步指出)。

我写了我的意图过滤器如下:

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

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

对于我的测试,我编写了一个小应用程序,该应用程序从文本框中获取一个字符串,ACTION_VIEW使用给定的 URI 创建一个意图,然后启动它 - 然后检查浏览器是否启动或我是否看到列出了我的应用程序的选择器。

该应用程序被正确识别为确切的路径 - 例如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- 我已经删除了这个问题的内容,因为它对这个周期匹配的行为没有影响。

是否有可能意图过滤器系统实际上不支持匹配文字.字符(不是设计而是错误),并且它们将始终被视为“任何”?

4

2 回答 2

2

是否有可能只匹配文字。意图过滤器系统实际上不支持字符(不是设计而是错误),并且它们将始终被视为“任何”?

是的,这看起来像一个 android 错误。我刚刚浏览了 android 的PatternMatcher的源代码,这种行为(错误?)一直存在。

即它看起来像匹配.文字只在一种情况下有效 - 当它前面有一个*表达式时。只有这样它才能在代码中正确转义 -\\被考虑在内)。这就是为什么试图匹配文件扩展名的人能够使用这样的模式:

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

只要转义序列 ( \\) 前面有其他内容,则不考虑*转义,并且点 ( ) 被视为通配符而不是文字并匹配任何字符。.

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

于 2019-03-10T12:33:16.543 回答
0

Just guessing here, you might try (hack) wrapping it in [], like this: pattern="filename[.]extn", so you're only accepting characters from the following list: "." - give it a shot?

There are plenty of other regex games you could probably play, but that's the first one that comes to mind.

于 2013-10-22T12:57:59.130 回答