/**
* 也许还存在不能完全处理的情形,但是,对于常规的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));
  }
}