@Override public Matcher mergeNext(Matcher after) { if (after instanceof TrueMatcher) { return this; } Matcher m = (next instanceof TrueMatcher) ? after : SeqMatcher.create(next, after); return new ZeroOrMoreMatcher(repeated, m); }
@Override public Matcher rewriteEnd(Function<Matcher, Matcher> f) { return f.apply(new ZeroOrMoreMatcher(repeated, next.rewriteEnd(f))); }
@Override public Matcher mergeNext(Matcher after) { if (after instanceof TrueMatcher) { return this; } Matcher m = (next instanceof TrueMatcher) ? after : SeqMatcher.create(next, after); return new ZeroOrMoreMatcher(repeated, m); }
@Override public Matcher rewriteEnd(Function<Matcher, Matcher> f) { return f.apply(new ZeroOrMoreMatcher(repeated, next.rewriteEnd(f))); }
@Override public Matcher rewrite(Function<Matcher, Matcher> f) { return f.apply(new ZeroOrMoreMatcher(repeated.rewrite(f), next.rewrite(f))); }
@Override public Matcher rewrite(Function<Matcher, Matcher> f) { return f.apply(new ZeroOrMoreMatcher(repeated.rewrite(f), next.rewrite(f))); }
@Test public void removeSequentialMatchAny() { Matcher input = new ZeroOrMoreMatcher( AnyMatcher.INSTANCE, new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, AnyMatcher.INSTANCE) ); Matcher expected = new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, AnyMatcher.INSTANCE); Assertions.assertEquals(expected, Optimizer.removeSequentialMatchAny(input)); }
/** * Get the prefix matcher. This is similar to {@link #head(Matcher)} except that it can * reach into character sequences as well as higher level sequences. */ static Matcher getPrefix(Matcher matcher) { if (matcher instanceof SeqMatcher) { List<Matcher> ms = matcher.<SeqMatcher>as().matchers(); return ms.get(0); } else if (matcher instanceof ZeroOrMoreMatcher) { ZeroOrMoreMatcher zm = matcher.as(); return new ZeroOrMoreMatcher(zm.repeated(), TrueMatcher.INSTANCE); } else if (matcher instanceof CharSeqMatcher) { String pattern = matcher.<CharSeqMatcher>as().pattern(); return pattern.isEmpty() ? null : new CharSeqMatcher(pattern.charAt(0)); } else { return matcher; } }
@Test public void convertRepeatedAnyCharSeqToIndexOf() { Matcher input = new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, SeqMatcher.create( new CharSeqMatcher("abc"), new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, SeqMatcher.create( new CharSeqMatcher("def"), new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, TrueMatcher.INSTANCE) )) )); Matcher expected = SeqMatcher.create( new IndexOfMatcher( "abc", new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, SeqMatcher.create( new CharSeqMatcher("def"), new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, TrueMatcher.INSTANCE) )) ) ); Assertions.assertEquals(expected, Optimizer.convertRepeatedAnyCharSeqToIndexOf(input)); }
@Test public void removeStartFollowedByMatchAny() { Matcher input = SeqMatcher.create( StartMatcher.INSTANCE, new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, AnyMatcher.INSTANCE) ); Matcher expected = new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, AnyMatcher.INSTANCE); Assertions.assertEquals(expected, Optimizer.removeStartFollowedByMatchAny(input)); }
@Test public void extractPrefixFromOr() { Matcher a = new CharSeqMatcher("a"); Matcher b = new CharSeqMatcher("b"); Matcher input = OrMatcher.create( new ZeroOrMoreMatcher(a, AnyMatcher.INSTANCE), new ZeroOrMoreMatcher(a, a), new ZeroOrMoreMatcher(a, b) ); Matcher expected = SeqMatcher.create( new ZeroOrMoreMatcher(a, TrueMatcher.INSTANCE), OrMatcher.create(AnyMatcher.INSTANCE, a, b) ); Assertions.assertEquals(expected, Optimizer.extractPrefixFromOr(input)); }
@Test public void inlineMatchAnyPrecedingOr() { Matcher a = new CharSeqMatcher("a"); Matcher b = new CharSeqMatcher("b"); Matcher input = new ZeroOrMoreMatcher( AnyMatcher.INSTANCE, OrMatcher.create(a, b) ); Matcher expected = OrMatcher.create( new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, a), new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, b) ); Assertions.assertEquals(expected, Optimizer.inlineMatchAnyPrecedingOr(input)); }
@Test public void zeroOrMoreFalse_Next() { Matcher input = new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, FalseMatcher.INSTANCE); Matcher expected = FalseMatcher.INSTANCE; Assertions.assertEquals(expected, Optimizer.zeroOrMoreFalse(input)); }
@Test public void zeroOrMoreFalse_Repeated() { Matcher input = new ZeroOrMoreMatcher(FalseMatcher.INSTANCE, AnyMatcher.INSTANCE); Matcher expected = AnyMatcher.INSTANCE; Assertions.assertEquals(expected, Optimizer.zeroOrMoreFalse(input)); }
@Test public void removeTrailingMatchAny() { Matcher input = new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, EndMatcher.INSTANCE); Matcher expected = TrueMatcher.INSTANCE; Assertions.assertEquals(expected, Optimizer.removeTrailingMatchAny(input)); }
@Test public void removeRepeatedStart() { Matcher input = new ZeroOrMoreMatcher(StartMatcher.INSTANCE, AnyMatcher.INSTANCE); Matcher expected = AnyMatcher.INSTANCE; Assertions.assertEquals(expected, Optimizer.removeRepeatedStart(input)); }
@Test public void zeroOrMoreMergeNext() { Matcher input = SeqMatcher.create( AnyMatcher.INSTANCE, new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, AnyMatcher.INSTANCE), AnyMatcher.INSTANCE ); Matcher expected = SeqMatcher.create( AnyMatcher.INSTANCE, new ZeroOrMoreMatcher( AnyMatcher.INSTANCE, SeqMatcher.create(AnyMatcher.INSTANCE, AnyMatcher.INSTANCE)) ); Assertions.assertEquals(expected, Optimizer.mergeNext(input)); }
@Test public void removeMatchAnyFollowedByStart() { Matcher input = new ZeroOrMoreMatcher(AnyMatcher.INSTANCE, SeqMatcher.create( StartMatcher.INSTANCE, AnyMatcher.INSTANCE )); Matcher expected = SeqMatcher.create(StartMatcher.INSTANCE, AnyMatcher.INSTANCE); Assertions.assertEquals(expected, Optimizer.removeMatchAnyFollowedByStart(input)); }
@Test public void optimizeOrIndexOf() { PatternMatcher actual = PatternMatcher.compile("^.*abc.*|.*def.*|.*ghi*."); PatternMatcher expected = OrMatcher.create( new IndexOfMatcher("abc", TrueMatcher.INSTANCE), new IndexOfMatcher("def", TrueMatcher.INSTANCE), new IndexOfMatcher( "gh", new ZeroOrMoreMatcher(new CharSeqMatcher("i"), AnyMatcher.INSTANCE) ) ); Assertions.assertEquals(expected, actual); }
@Test public void removeMatchAnyFollowedByIndexOf() { Matcher input = new ZeroOrMoreMatcher( AnyMatcher.INSTANCE, new IndexOfMatcher("foo", TrueMatcher.INSTANCE)); Matcher expected = new IndexOfMatcher("foo", TrueMatcher.INSTANCE); Assertions.assertEquals(expected, Optimizer.removeMatchAnyFollowedByIndexOf(input)); }