Android的模式細節:
.
任何字符匹配。
*
匹配0個或多個出現在其之前的字符。
.*
匹配0個或更多的任何字符。
\
用於轉義模式中的特殊字符。當從XML文件讀取字符串時,\
也用作轉義字符。因此,爲了避免模式中的特殊字符,必須使用雙斜槓\\
。
問題: 在這種模式".*\\myfile\\.ext"
,你正試圖轉義字符m
這是一個正常的字符。因此它沒有任何區別。它相當於".*myfile\\.ext"
。意圖數據部分是file:///mnt/sdcard/tmp/myfile.ext
。該模式與/mnt/sdcard/tmp/myfile.ext
相匹配,但失敗。
.*
嘗試匹配任何字符,直到第一次出現m
,這恰好是第二個字符,即/mnt
。 模式期望下一個字符是y
,但它得到n
,因此模式匹配失敗。
解: 對於上面的路徑中,圖案/.*/.*/.*/myfile\\.ext
作品。
對於/mnt/sdcard/myfile.ext
路徑,模式/.*/.*/myfile\\.ext
起作用。如果您不確定子目錄級別,則必須添加具有不同pathPattern
值的多個<data>
元素。
<data
android:scheme="file"
android:mimeType="*/*"
android:host="*" />
<data android:pathPattern="/.*/.*/.*/myfile\\.ext" /> <!-- matches file:///mnt/sdcard/tmp/myfile.ext -->
<data android:pathPattern="/.*/.*/myfile\\.ext" /> <!-- matches file:///mnt/sdcard/myfile.ext -->
下面是用於模式匹配的方法PatternMatcher.matchPattern:
static boolean matchPattern(String pattern, String match, int type) {
if (match == null) return false;
if (type == PATTERN_LITERAL) {
return pattern.equals(match);
} if (type == PATTERN_PREFIX) {
return match.startsWith(pattern);
} else if (type != PATTERN_SIMPLE_GLOB) {
return false;
}
final int NP = pattern.length();
if (NP <= 0) {
return match.length() <= 0;
}
final int NM = match.length();
int ip = 0, im = 0;
char nextChar = pattern.charAt(0);
while ((ip<NP) && (im<NM)) {
char c = nextChar;
ip++;
nextChar = ip < NP ? pattern.charAt(ip) : 0;
final boolean escaped = (c == '\\');
if (escaped) {
c = nextChar;
ip++;
nextChar = ip < NP ? pattern.charAt(ip) : 0;
}
if (nextChar == '*') {
if (!escaped && c == '.') {
if (ip >= (NP-1)) {
// at the end with a pattern match, so
// all is good without checking!
return true;
}
ip++;
nextChar = pattern.charAt(ip);
// Consume everything until the next character in the
// pattern is found.
if (nextChar == '\\') {
ip++;
nextChar = ip < NP ? pattern.charAt(ip) : 0;
}
do {
if (match.charAt(im) == nextChar) {
break;
}
im++;
} while (im < NM);
if (im == NM) {
// Whoops, the next character in the pattern didn't
// exist in the match.
return false;
}
ip++;
nextChar = ip < NP ? pattern.charAt(ip) : 0;
im++;
} else {
// Consume only characters matching the one before '*'.
do {
if (match.charAt(im) != c) {
break;
}
im++;
} while (im < NM);
ip++;
nextChar = ip < NP ? pattern.charAt(ip) : 0;
}
} else {
if (c != '.' && match.charAt(im) != c) return false;
im++;
}
}
if (ip >= NP && im >= NM) {
// Reached the end of both strings, all is good!
return true;
}
// One last check: we may have finished the match string, but still
// have a '.*' at the end of the pattern, which should still count
// as a match.
if (ip == NP-2 && pattern.charAt(ip) == '.'
&& pattern.charAt(ip+1) == '*') {
return true;
}
return false;
}
沒有像檢查的答案,解決方案,你評論說,它沒有工作。好運 – danny117 2014-09-09 14:32:27