in spectator-api/src/main/java/com/netflix/spectator/impl/matcher/PatternUtils.java [374:466]
private static void rewriteNextLookahead(Matcher matcher, Matcher[] results) {
if (matcher instanceof IndexOfMatcher) {
IndexOfMatcher m = matcher.as();
rewriteNextLookahead(m.next(), results);
for (int i = 0; i < results.length; ++i) {
if (results[i] != null) {
results[i] = new IndexOfMatcher(m.pattern(), results[i]);
}
}
} else if (matcher instanceof SeqMatcher) {
SeqMatcher m = matcher.as();
Matcher[] ms = m.matchers().toArray(new Matcher[0]);
for (int i = 0; i < ms.length; ++i) {
results[0] = null;
rewriteNextLookahead(ms[i], results);
if (results[2] != null) {
// Truncated sequence with lookahead match at the end
List<Matcher> matchers = new ArrayList<>(i + 1);
matchers.addAll(Arrays.asList(ms).subList(0, i));
if (results[0] != null) {
matchers.add(results[0]);
results[0] = SeqMatcher.create(matchers);
} else {
matchers.add(results[1]);
results[1] = SeqMatcher.create(matchers);
}
// Matcher with lookahead removed
ms[i] = results[2];
results[2] = SeqMatcher.create(ms);
break;
} else if (results[0] == null) {
// Indicates this entry of the sequence cannot be simplified
return;
} else {
results[0] = m;
}
}
} else if (matcher instanceof ZeroOrMoreMatcher) {
ZeroOrMoreMatcher m = matcher.as();
if (containsLookahead(m.repeated())) {
return;
}
removeNextLookahead(m.next(), results);
for (int i = 0; i < results.length; ++i) {
if (results[i] != null) {
results[i] = new ZeroOrMoreMatcher(m.repeated(), results[i]);
}
}
} else if (matcher instanceof ZeroOrOneMatcher) {
ZeroOrOneMatcher m = matcher.as();
if (containsLookahead(m.repeated())) {
return;
}
removeNextLookahead(m.next(), results);
for (int i = 0; i < results.length; ++i) {
if (results[i] != null) {
results[i] = new ZeroOrOneMatcher(m.repeated(), results[i]);
}
}
} else if (matcher instanceof RepeatMatcher) {
RepeatMatcher m = matcher.as();
if (m.max() > 1000 || containsLookahead(m.repeated())) {
// Some engines like RE2 have limitations on the number of repetitions. Treat
// those as failures to match to the expression.
return;
} else {
results[0] = matcher;
}
} else if (matcher instanceof PositiveLookaheadMatcher) {
PositiveLookaheadMatcher m = matcher.as();
if (containsLookahead(m.matcher())) {
return;
}
results[0] = m.matcher();
results[2] = TrueMatcher.INSTANCE;
} else if (matcher instanceof NegativeLookaheadMatcher) {
NegativeLookaheadMatcher m = matcher.as();
if (containsLookahead(m.matcher())) {
return;
}
results[1] = m.matcher();
results[2] = TrueMatcher.INSTANCE;
} else if (!containsLookahead(matcher)) {
results[0] = matcher;
}
for (int i = 0; i < results.length; ++i) {
if (results[i] != null) {
results[i] = Optimizer.optimize(results[i]);
}
}
}