for (int i = 0; i < token; i+=2) {
if (expression.regionMatches(tokens[i], "or", 0, tokens[i+1] - tokens[i])) {
if (i == 0 || i > token - 2) {
throw new IllegalArgumentException("Bad syntax: " + expression);
}
PathMatcher left = doParse(expression.substring(tokens[0], tokens[i-1]));
PathMatcher right = doParse(expression.substring(tokens[i+2], tokens[token-1]));
return new OrMatcher(left, right);
}
}
for (int i = 0; i < token; i+=2) {
if (expression.regionMatches(tokens[i], "and", 0, tokens[i+1] - tokens[i])) {
if (i == 0 || i > token - 2) {
throw new IllegalArgumentException("Bad syntax: " + expression);
}
PathMatcher left = doParse(expression.substring(tokens[0], tokens[i-1]));
PathMatcher right = doParse(expression.substring(tokens[i+2], tokens[token-1]));
return new AndMatcher(left, right);
}
}
if (token > 2 && expression.regionMatches(tokens[0], "not", 0, tokens[1] - tokens[0])) {
PathMatcher right = doParse(expression.substring(tokens[2], tokens[token-1]));
return new NotMatcher(right);
}
if (!expression.matches("[a-z]+:.*")) {
expression = "glob:" + expression;
}