Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pathPattern to match file extension does not work if a period exists elsewhere in the file name?

Tags:

android

I see numerous examples of using pathPattern to define an intent-filter for a specific file extension/type; for example, pathPattern=".*\\.xyz".

Unfortunately, this does not appear to work properly if the file in question has a period elsewhere in the path; for example "my.filename.xyz".

Is there a pathPattern syntax that will match both "myfilename.xyz" and "my.filename.xyz"?

like image 293
Robert Nekic Avatar asked Aug 03 '10 19:08

Robert Nekic


2 Answers

Ran into the same problem trying to open a file in a dot folder. I found I could just add multiple "data" elements, depending on how many dots I expected to have in my paths:

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

Ugly, though. Anyone know a better way?

like image 109
Jason Van Cleve Avatar answered Sep 29 '22 07:09

Jason Van Cleve


The android team chose an unfortunate way to implement pathPattern. You can take a look at how the pattern matching is implemented in the android.os.PatternMatch class:

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

We're used to .* working like it does in a regular expression, where the * match is greedy and will match as many characters as possible. In PatterMatch's implementation, the match is not greedy. The .* will match as many characters as it can, until it finds a match for the next character in the string.

Example:

String: "/mnt/my.file.mytype"
pathPattern: ".*\\.mytype"

The ".*" in the pathPattern will match the substring "/mnt/my", and hence will fail to match the string.

Given this limitation, I don't see a way to write a pathPattern that can match any string that ends in ".mytype". The best you can do is follow Jason's solution to add additional patterns to match paths with as many dots as you are willing to specify patterns.

like image 36
Brian Pellin Avatar answered Sep 29 '22 07:09

Brian Pellin