private Token parseSlashCombination() {
        char c = current;
        consume();
        if (isSpecialCharacter(c)) {
            return new Token(Type.CHARACTER, String.valueOf(c));
        } else {
            switch (c) {
                case 'd': return new Token(Type.CLASS_DIGIT, "d");
                case 'D': return new Token(Type.CLASS_NON_DIGIT, "D");
                case 's': return new Token(Type.CLASS_WHITESPACE, "s");
                case 'S': return new Token(Type.CLASS_NON_WHITESPACE, "S");
                case 'w': return new Token(Type.CLASS_WORD_CHARACTER, "w");
                case 'W': return new Token(Type.CLASS_NON_WORD_CHARACTER, "W");
                case 'b': return new Token(Type.WORD_BOUNDARY, "b");
                case 'B': return new Token(Type.NON_WORD_BOUNDARY, "B");
                default : throw new LexerException("Unexpected character " + c);
            }
        }
    }