content: package com.taobao.yugong.common.utils;
  
  import java.util.Map;
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  
  import org.apache.commons.lang.StringUtils;
  
  import com.google.common.base.Function;
  import com.google.common.collect.MapMaker;
  import com.google.common.collect.MigrateMap;
  import com.taobao.yugong.exception.YuGongException;
  
  public class LikeUtil {
  
      public static String[]              regexSpecialChars = { "<", ">", "^", "$", "\\", "/", ";", "(", ")", "?", ".",
              "*", "[", "]", "+", "|"                      };
      public static String                escapse           = "\\";
  
      private static Map<String, Pattern> patterns          = MigrateMap.makeComputingMap(new MapMaker(),
                                                                new Function<String, Pattern>() {
  
                                                                    public Pattern apply(String pattern) {
                                                                        try {
                                                                            return Pattern.compile(buildPattern(pattern,
                                                                                escapse),
                                                                                Pattern.CASE_INSENSITIVE);
                                                                        } catch (Throwable e) {
                                                                            throw new YuGongException(e);
                                                                        }
                                                                    }
                                                                });
  
      public static boolean isMatch(String pattern, String value) {
          if (StringUtils.equalsIgnoreCase(pattern, value)) {
              return true;
          } else if (StringUtils.isEmpty(value)) {
              return false;
          } else if (StringUtils.isEmpty(pattern)) {
              return false;
          }
  
          Pattern pat = patterns.get(pattern);
          Matcher m = pat.matcher(value);
          return m.matches();
      }
  
      private static String buildPattern(String pattern, String escape) {
          char esc = escape.charAt(0);
          pattern = StringUtils.trim(pattern);
          StringBuilder builder = new StringBuilder("^");
          int index = 0, last = 0;
          while (true) {
              // 查找esc
              index = pattern.indexOf(esc, last);
              if (index == -1 || index >= pattern.length()) {
                  if (last < pattern.length()) {
                      builder.append(convertWildcard(ripRegex(pattern.substring(last))));
                  }
                  break;
              }
              if (index > 0) {
                  String toRipRegex = StringUtils.substring(pattern, last, index);
                  builder.append(convertWildcard(ripRegex(toRipRegex)));
                  last = index;
              }
              if (index + 1 < pattern.length()) {
                  builder.append(ripRegex(pattern.charAt(index + 1)));
                  last = index + 2;
              } else {
                  builder.append(pattern.charAt(index));
                  last = index + 1;
              }
              if (last >= pattern.length()) {
                  break;
              }
          }
          builder.append('$');
          return builder.toString();
      }
  
      private static String ripRegex(char toRip) {
          char[] chars = new char[1];
          chars[0] = toRip;
          return ripRegex(new String(chars));
      }
  
      private static String ripRegex(String toRip) {
          for (String c : regexSpecialChars) {
              toRip = StringUtils.replace(toRip, c, "\\" + c);
          }
  
          return toRip;
      }
  
      private static String convertWildcard(String toConvert) {
          toConvert = StringUtils.replace(toConvert, "_", "(.)");
          toConvert = StringUtils.replace(toConvert, "%", "(.*)");
          return toConvert;
      }
  }
  