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; }