文件路径模式匹配无法匹配包含其他点的文件名的文件扩展名?

42

我看到很多使用pathPattern来定义特定文件扩展名/类型的intent-filter的例子,例如 pathPattern=".*\\.xyz"

不幸的是,如果路径中的文件在其他地方有一个句点(比如"my.filename.xyz"),这种方法似乎不能正常工作。

是否有一种pathPattern语法可以同时匹配"myfilename.xyz"和"my.filename.xyz"?

3个回答

50

尝试在点文件夹中打开文件时遇到了相同的问题。我发现只需添加多个"data"元素,取决于我期望路径中有多少个点:

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

不过有点丑,有人知道更好的方法吗?


4
没关系,无论猫是黑色还是白色,重要的是能抓老鼠。谢谢你! - Bruce
<data android:pathPattern="[.*\\.]+mytype"/> 这个怎么样?它如果像正则表达式一样工作,那么这个也可能行得通:<data android:pathPattern="\\.mytype$"/> - Sourabh
即使它能够工作,但由于没有文档支持,我们只能使用Jason的解决方案...(赞!) - Rick77
1
为什么在模式中需要双斜杠? - IgorGanapolsky
2
非常感谢,一般来说我不喜欢采用蛮力的方法,但同样的方式是解决我们遇到类似问题的唯一途径。 - Paul Popiel

46

Android团队在实现pathPattern时选择了一种不幸的方式。您可以查看android.os.PatternMatch类中如何实现模式匹配:

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/PatternMatcher.java

我们习惯于使用.*和正则表达式中的贪婪模式相同,即尽可能匹配尽可能多的字符。在PatternMatch的实现中,匹配不是贪婪的。 .*将尽可能匹配尽可能多的字符,直到它找到字符串中下一个字符的匹配项为止。

例如:

字符串:"/mnt/my.file.mytype"
pathPattern:" .*\\.mytype "

在pathPattern中的“.*”将匹配子字符串“/mnt/my”,因此无法匹配该字符串。

鉴于这个限制,我没有找到一种方法来编写一个pathPattern,能够匹配以“.mytype”结尾的任何字符串。最好的方法是遵循Jason的解决方案,添加额外的模式以匹配具有尽可能多点的路径,只要您愿意指定模式即可。


6
我使用了这个:

<activity
   android:name=".activity.GifActivity"
   android:label="Cool Player ^_^">
   <intent-filter>
       <action android:name="android.intent.action.VIEW" />
       <category android:name="android.intent.category.DEFAULT" />
       <data android:scheme="http"/>
       <data android:scheme="https" />
       <data android:host="*"/>
       <data android:pathPattern="/.*\\.mp4"/>
   </intent-filter>
</activity>

这将打开以下网址:

以下网址则不会打开:

我认为这里的关键是 host =“*”。 我没有对此进行深入研究,但对我有用,希望能帮助到其他人。


我尝试使用"/.*-mp3"匹配http://www.umaplay.com/2322-tingo_fuse-odg-mp3,但似乎没有匹配成功。我是否漏掉了什么? - frostymarvelous
我通过逐步调试模式匹配器来解决了这个问题。第一个"-",即"-tingo"导致匹配失败。幸运的是,我知道只会有3个连字符,所以我的解决方案变成了"/.-.-.*-mp3"。 - frostymarvelous
4
第一个斜杠的目的是什么? - IgorGanapolsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接