Exemple #1
0
        public void Segment(SegmentMarker marker, MessageSegmentType originalType, string text)
        {
            if (originalType != MessageSegmentType.Undefined)
            {
                return; //already defined
            }
            if (_lastSegmentClosed)
            {
                marker.NewMark(originalType, 0, 0); //start mark, needs to be removed if no other mark is found
            }
            else
            {
                marker.NewMark(Format.Type, 0, 0); //this should not be deleted, even if no more marks are found
            }
            var match = !_lastSegmentClosed;

            for (var i = 0; i < text.Length; ++i)
            {
                if (match)
                {
                    var tokenLength = MatchesToken(text, i, Format.EndTokens);
                    if (0 < tokenLength)
                    { // closing marker found
                        match           = false;
                        marker.Mark.End = i + tokenLength;
                        marker.NewMark(originalType, i + tokenLength, i + tokenLength);
                        i = i + tokenLength - 1;
                    }
                }
                else
                {
                    var tokenLength = MatchesToken(text, i, Format.StartTokens);
                    if (0 < tokenLength)
                    { // opening marker found
                        match           = true;
                        marker.Mark.End = i;
                        marker.NewMark(Format.Type, i, i + tokenLength);
                        i = i + tokenLength - 1;
                    }
                }
            }

            marker.Mark.End = text.Length;
            if (_lastSegmentClosed)
            {
                if (marker.Count == 1) //no matches found, clear all marks and continue
                {
                    marker.Clear();
                }
            }
            _lastSegmentClosed = !match;
        }
        public void Segment(SegmentMarker marker, MessageSegmentType currentType, string text)
        {
            var matches = new List <(int Start, int End)>();

            foreach (var pattern in Pattern)
            {
                var match = pattern.Match(text);
                while (match.Success)
                {
                    matches.Add((match.Index, match.Index + match.Length));
                    match = match.NextMatch();
                }
            }

            matches.Sort((a, b) => a.Start - b.Start);

            for (var i = 1; i < matches.Count;)
            {
                var previous = matches[i - 1];
                var current  = matches[i];
                if (current.Start <= previous.End)
                {
                    previous.End = System.Math.Max(previous.End, current.End);
                    matches.RemoveAt(i);
                }
                else
                {
                    i += 1;
                }
            }

            marker.NewMark(currentType, 0);
            foreach (var match in matches)
            {
                marker.Mark.End = match.Start;
                marker.NewMark(SegmentType, match.Start, match.End);
                marker.NewMark(currentType, match.End);
            }
            marker.Mark.End = text.Length;
        }
Exemple #3
0
 public MessageSegment(MessageSegmentType type, string message)
 {
     this.Type = type;
     this.Text = message;
 }