public void NonGreedyContentStopsMatchingWhenFollowingTokensMatch() { // It's likely we'll only be able to get one or two tokens into // the "following" list, since they effectively become "mandatory" var following = new[] { new SimplePatternElement(Matchers.LiteralText(" (")), new SimplePatternElement(Matchers.Identifier, "last"), new SimplePatternElement(Matchers.LiteralText(")")) }; var pattern = new NameValueExtractor(new[] { new SimplePatternElement(Matchers.Identifier, "first"), new SimplePatternElement(Matchers.LiteralText(" ")), new SimplePatternElement(Matchers.NonGreedyContent(following), "content"), }.Concat(following)); var frame = "abc def ghi (jkl)"; var(properties, remainder) = pattern.ExtractValues(frame); Assert.Null(remainder); Assert.Equal("abc", properties["first"].ToString()); Assert.Equal("def ghi", properties["content"].ToString()); Assert.Equal("jkl", properties["last"].ToString()); }
public PlainTextLogEventReader(TextReader input, string extractionPattern) { if (extractionPattern == null) { throw new ArgumentNullException(nameof(extractionPattern)); } _nameValueExtractor = ExtractionPatternInterpreter.CreateNameValueExtractor(ExtractionPatternParser.Parse(extractionPattern)); _reader = new FrameReader(input, SpanEx.MatchedBy(_nameValueExtractor.StartMarker), TrailingLineArrivalDeadline); }
public void SingleLineContentMatchesUntilEol() { var pattern = new NameValueExtractor(new[] { new SimplePatternElement(Matchers.Identifier, "first"), new SimplePatternElement(Matchers.LiteralText(" ")), new SimplePatternElement(Matchers.SingleLineContent, "content"), new SimplePatternElement(Matchers.LiteralText(" (")), new SimplePatternElement(Matchers.Identifier, "last"), new SimplePatternElement(Matchers.LiteralText(")")) }); var frame = "abc def ghi (jkl)"; var(properties, remainder) = pattern.ExtractValues(frame); Assert.Null(remainder); Assert.Equal("abc", properties["first"].ToString()); Assert.Equal("def ghi (jkl)", properties["content"].ToString()); }