Я пытаюсь настроить серию регулярных выражений для сопоставления неизвестных входящих данных.
Что я хочу сделать, так это определить, соответствует ли каждое выражение данным, не может ли они совпадать или может соответствовать данным на данный момент.
Например, если у нас есть следующие регулярные выражения:
\Aaaab
\Aaaac
\Abbb
Тогда, если мы уже получили aa
, то первые два могут совпадать, в зависимости от того, что будет дальше, но третий никогда не совпадет.
Если мы получим еще немного и получим aaac
, то первое не будет совпадать, второе совпадет, а третье все равно не совпадет.
В Java это можно сделать так:
Pattern pattern = Pattern.compile("\Aaaab");
Matcher matcher = pattern.matcher(receivedSoFar);
if (matcher.matches())
{
// A match has been found now
}
else if (matcher.hitEnd())
{
// Doesn't match yet, but don't write it off, wait for more data.
}
else
{
// This pattern doesn't match at all, we can rule it out.
}
См. здесь рабочий пример.
Различие между «может соответствовать» и «не соответствует» важно, потому что, если мы достигнем точки, где ни один из шаблонов не может совпадать, нам нужно будет вызвать реакцию состояния ошибки.
Я искал способ реализовать это в C# DotNet и не смог его найти. Класс System.Text.RegularExpressions.Match
имеет только свойство Success
, которое сообщает нам, найдено ли совпадение, но не может сказать нам, возможно ли совпадение в будущем.
Есть ли способ сделать это в C# DotNet?
Я попробовал Google, документацию learn.microsoft.com
и даже, в отчаянии,
Отредактировано: Извините, я случайно упомянул requireEnd
, где имел в виду hitEnd
.
🤔 А знаете ли вы, что...
C# (C Sharp) - это современный объектно-ориентированный язык программирования, разработанный Microsoft.
Посмотрите https://github.com/ltrzesniewski/pcre-net (Perl-совместимые регулярные выражения для .NET)
В файле readme есть раздел о частичном совпадении, он может охватывать ваш вариант использования.
Я не знаю хорошего способа решить это требование с помощью внутренней реализации Regex .Net, поэтому лучшим выбором может быть использование альтернативной реализации nuget.