blob: b48c1474cabb0ea0e420ec010420a9d1573c9259 [file] [log] [blame]
package aQute.libg.glob;
import java.util.regex.*;
public class Glob {
private final String glob;
private final Pattern pattern;
public Glob(String globString) {
this.glob = globString;
this.pattern = Pattern.compile(convertGlobToRegEx(globString));
}
public Matcher matcher(CharSequence input) {
return pattern.matcher(input);
}
@Override
public String toString() {
return glob;
}
private static String convertGlobToRegEx(String line) {
line = line.trim();
int strLen = line.length();
StringBuilder sb = new StringBuilder(strLen);
// Remove beginning and ending * globs because they're useless
if (line.startsWith("*")) {
line = line.substring(1);
strLen--;
}
if (line.endsWith("*")) {
line = line.substring(0, strLen - 1);
strLen--;
}
boolean escaping = false;
int inCurlies = 0;
for (char currentChar : line.toCharArray()) {
switch (currentChar) {
case '*' :
if (escaping)
sb.append("\\*");
else
sb.append(".*");
escaping = false;
break;
case '?' :
if (escaping)
sb.append("\\?");
else
sb.append('.');
escaping = false;
break;
case '.' :
case '(' :
case ')' :
case '+' :
case '|' :
case '^' :
case '$' :
case '@' :
case '%' :
sb.append('\\');
sb.append(currentChar);
escaping = false;
break;
case '\\' :
if (escaping) {
sb.append("\\\\");
escaping = false;
} else
escaping = true;
break;
case '{' :
if (escaping) {
sb.append("\\{");
} else {
sb.append('(');
inCurlies++;
}
escaping = false;
break;
case '}' :
if (inCurlies > 0 && !escaping) {
sb.append(')');
inCurlies--;
} else if (escaping)
sb.append("\\}");
else
sb.append("}");
escaping = false;
break;
case ',' :
if (inCurlies > 0 && !escaping) {
sb.append('|');
} else if (escaping)
sb.append("\\,");
else
sb.append(",");
break;
default :
escaping = false;
sb.append(currentChar);
}
}
return sb.toString();
}
}