public static List <string> SplitOnUnescaped(string data, string[] values) { List <string> vals = new List <string>(values); vals.Sort((a, b) => - 1 * a.CompareTo(b)); List <string> splits = new List <string>(); while (!string.IsNullOrEmpty(data)) { int first = -1; int foundLength = -1; foreach (var val in vals) { var loc = data.IndexOf(val); if (loc == -1) { continue; } if (ParserTools.NotEscaped(data, loc) && (loc < first || first == -1)) { first = loc; foundLength = val.Length; } } if (first == -1) { splits.Add(data); break; } if (first != 0) { splits.Add(data.Substring(0, first)); splits.Add(data.Substring(first, foundLength)); } data = data.Substring(first + foundLength); } return(splits); }
private SegmentParseResult GetSegment(string segment) { var mySegs = new List <Segment>(); int occurences = 0; int start = -1; int end = -1; int lastEndMatch = -1; for (int i = 0; i < segment.Length; i++) { if (segment[i] == '(' && ParserTools.NotEscaped(segment, i)) { occurences += 1; if (start == -1) { start = i; if (start > 0 && start - lastEndMatch > 1) { var text = segment.Substring(lastEndMatch + 1, start - lastEndMatch - 1); var newSegs = GetSegmentsFromString(text); var last = newSegs.Last(); if (last.WithNext == GroupOperators.None) { last.WithNext = GetNextOperator(segment, i); } mySegs.AddRange(newSegs); } } continue; } if (segment[i] == ')' && ParserTools.NotEscaped(segment, i)) { occurences -= 1; if (occurences == 0) { end = i; lastEndMatch = i; var seg = GetSegment(segment.Substring(start + 1, end - start - 1)); if (seg.HadError) { return(seg); } else { seg.Segment.WithNext = GetNextOperator(segment, i); mySegs.Add(seg.Segment); } start = -1; end = -1; } } } //uneven if (occurences > 0) { return(new SegmentParseResult { HadError = true, ErrorReason = ParseErrors.NoEndingParenthesis }); } else if (occurences < 0) { return(new SegmentParseResult { HadError = true, ErrorReason = ParseErrors.NoStartingParenthesis }); } //none if (start == -1 && end == -1 && mySegs.Count == 0) { var results = GetSegmentsFromString(segment); var result = new Segment(); if (results.Count > 1) { result.HasSegments = true; result.Segments = results; } else { result = results.First(); } return(new SegmentParseResult { HadError = false, Segment = result }); } //remainder if (start == -1 && end == -1 && mySegs.Count > 0 && lastEndMatch < segment.Length - 1) { mySegs.Add(new Segment { HasSegments = false, Value = segment.Substring(end + 1) }); } return(new SegmentParseResult { Segment = new Segment { HasSegments = true, Segments = mySegs }, HadError = false }); }