// In : One or more markers. Один или несколько маркеров. // Метод только для входящих данных, так как для вывода нелогично выводить // одновременно несколько серий данных. public IIOMultiMarkerQuery OneOf(string m1, params string[] markers) { var matcher = new CStringMatcher(m1, markers); // До тех пор, пока в буфере есть входящие данные, // и пока совпадение строк имеет "выжившие" маркеры, // мы продолжаем анализ. while (Buffer.Peek(out char c) && (matcher[c] > 0)) { matcher.Continue(c); // Если есть совпавшие маркеры. if (matcher.MatchCount > 0) { // Буфер съедает совпавший маркер и переходит дальше. Buffer.Pop(matcher.FirstMatch.Length); return(new QMultiMarker { MatchedMarker = matcher.FirstMatch, MarkerSet = new string[] { matcher.FirstMatch }, Success = true, }); } } return(new QMultiMarker { MatchedMarker = string.Empty, MarkerSet = new string[] { }, Success = false, }); }
// Более глубокая версия функции OneOf. Возвращает все маркеры, // которые совпали, чтобы можно было произвести анализ. public IIOMultiMarkerQuery OneOfDeep(string m1, params string[] markers) { var matcher = new CStringMatcher(m1, markers); // До тех пор, пока в буфере есть входящие данные, // и пока совпадение строк имеет "выжившие" маркеры, // мы продолжаем анализ. while (Buffer.Peek(out char c) && (matcher[c] > 0)) { matcher.Continue(c); } return(new QMultiMarker { MatchedMarker = matcher.FirstMatch, MarkerSet = matcher.MatchResult.ToArray(), Success = (matcher.MatchCount > 0), }); }