protected String globToRegex()

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;
    }