blob: 6202524408bb82edd97c5a558a49057c8e5c3e49 [file] [log] [blame]
package aQute.libg.glob;
import java.util.*;
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);
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();
}
public void select(List<?> objects) {
for ( Iterator<?> i =objects.iterator(); i.hasNext(); ) {
String s = i.next().toString();
if ( !matcher(s).matches())
i.remove();
}
}
public static Pattern toPattern(String s) {
try {
return Pattern.compile( convertGlobToRegEx(s));
} catch( Exception e) {
// ignore
}
return null;
}
}