* 也许还存在不能完全处理的情形,但是,对于常规的java类名和包名等通配符匹配,则完全可以胜任!
* @author wuhe.jyh
*
*/
public class WildMatch {
private static boolean wildMatch(String pattern, String str) {
pattern = toJavaPattern(pattern);
System.out.println("pattern: " + pattern);
return java.util.regex.Pattern.matches(pattern, str);
}
private static String toJavaPattern(String pattern) {
String result = "^";
char metachar[] = { '$', '^', '[', ']', '(', ')', '{', '|', '+', '.',
'/', '\\' };
for (int i = 0; i < pattern.length(); i++) {
char ch = pattern.charAt(i);
boolean isMeta = false;
for (int j = 0; j < metachar.length; j++) {
if (ch == metachar[j]) {
result += "\\" + ch;
isMeta = true;
break;
}
}
// 对 * 和 ? 进行特殊处理
if (!isMeta) {
if (ch == '*') {
result += ".*";
} else if (ch == '?') {
result += '.';
} else {
result += ch;
}
}
}
result += "$";
return result;
}
public static void main(String[] args) {
test("*", "toto");
test("toto.java", "tutu.java");
test("12345", "1234");
test("1234", "12345");
test("*f", "");
test("***", "toto");
test("*.java", "toto.");
test("*.java", "toto.jav");
test("*.java", "toto.java");
test("abc*", "");
test("a*c", "abbbbbccccc");
test("abc*xyz", "abcxxxyz");
test("*xyz", "abcxxxyz");
test("abc**xyz", "abcxxxyz");
test("abc**x", "abcxxx");
test("*a*b*c**x", "aaabcxxx");
test("abc*x*yz", "abcxxxyz");
test("abc*x*yz*", "abcxxxyz");
test("a*b*c*x*yf*z*", "aabbccxxxeeyffz");
test("a*b*c*x*yf*zze", "aabbccxxxeeyffz");
test("a*b*c*x*yf*ze", "aabbccxxxeeyffz");
test("a*b*c*x*yf*ze", "aabbccxxxeeyfze");
test("*LogServerInterface*.java", "_LogServerInterfaceImpl.java");
test("abc*xyz", "abcxyxyz");
test("a?", "abc");
test("a?", "a3");
test("a?", "a$");
test("?a", "?a");
}
private static void test(String pattern, String str) {
System.out.println(pattern + ", " + str + " =>> "
+ wildMatch(pattern, str));
}
}