in sshd-common/src/main/java/org/apache/sshd/common/file/util/BaseFileSystem.java [173:258]
protected String globToRegex(String pattern) {
StringBuilder sb = new StringBuilder(Objects.requireNonNull(pattern, "No pattern").length());
int inGroup = 0;
int inClass = 0;
int firstIndexInClass = -1;
char[] arr = pattern.toCharArray();
for (int i = 0; i < arr.length; i++) {
char ch = arr[i];
switch (ch) {
case '\\':
i++;
if (i >= arr.length) {
sb.append('\\');
} else {
char next = arr[i];
switch (next) {
case ',':
// escape not needed
break;
case 'Q':
case 'E':
// extra escape needed
sb.append("\\\\");
break;
default:
sb.append('\\');
break;
}
sb.append(next);
}
break;
case '*':
sb.append((inClass == 0) ? ".*" : "*");
break;
case '?':
sb.append((inClass == 0) ? '.' : '?');
break;
case '[':
inClass++;
firstIndexInClass = i + 1;
sb.append('[');
break;
case ']':
inClass--;
sb.append(']');
break;
case '.':
case '(':
case ')':
case '+':
case '|':
case '^':
case '$':
case '@':
case '%':
if ((inClass == 0) || ((firstIndexInClass == i) && (ch == '^'))) {
sb.append('\\');
}
sb.append(ch);
break;
case '!':
sb.append((firstIndexInClass == i) ? '^' : '!');
break;
case '{':
inGroup++;
sb.append('(');
break;
case '}':
inGroup--;
sb.append(')');
break;
case ',':
sb.append((inGroup > 0) ? '|' : ',');
break;
default:
sb.append(ch);
}
}
String regex = sb.toString();
if (log.isTraceEnabled()) {
log.trace("globToRegex({}): {}", pattern, regex);
}
return regex;
}