in spectator-api/src/main/java/com/netflix/spectator/impl/matcher/Parser.java [223:303]
private AsciiSet charClass() {
AsciiSet tmp;
AsciiSet set = AsciiSet.none();
boolean rangeStart = false;
boolean invert = peek() == '^';
if (invert) {
advance();
set = AsciiSet.all();
}
if (peek() == ']' || peek() == '-') {
char c = advance();
set = update(set, AsciiSet.fromPattern(Character.toString(c)), invert);
}
while (!isAtEnd() && peek() != ']') {
char c = advance();
switch (c) {
case '[':
set = set.union(charClass());
rangeStart = false;
break;
case '&':
if (peek() == '&') {
advance();
if (peek() == '[') {
advance();
set = set.intersection(charClass());
} else if (peek() != ']') {
set = set.intersection(charClass());
--current;
}
} else {
set = update(set, AsciiSet.fromPattern(Character.toString(c)), invert);
}
rangeStart = false;
break;
case '\\':
tmp = namedCharClass();
if (tmp == null) {
c = advance();
rangeStart = true;
set = update(set, AsciiSet.fromPattern(Character.toString(c)), invert);
} else {
rangeStart = false;
set = update(set, tmp, invert);
}
break;
case '-':
if (rangeStart && peek() != ']') {
if (peek() == '\\') {
advance();
tmp = namedCharClass();
if (tmp == null) {
String range = tokens.subSequence(current - 3, current - 1).toString() + peek();
if (range.endsWith("\\")) {
advance();
}
set = update(set, AsciiSet.fromPattern(range), invert);
} else {
set = update(set, AsciiSet.fromPattern("-"), invert);
set = update(set, tmp, invert);
}
} else {
String range = tokens.subSequence(current - 2, current + 1).toString();
set = update(set, AsciiSet.fromPattern(range), invert);
}
} else {
set = update(set, AsciiSet.fromPattern("-"), invert);
}
rangeStart = false;
break;
default:
rangeStart = true;
set = update(set, AsciiSet.fromPattern(Character.toString(c)), invert);
break;
}
}
if (advance() != ']') {
throw error("unclosed character class");
}
return set;
}