Генератор исходных выражений регулярных выражений с большим регулярным выражением вызывает исключение OutOfMemoryException при сборке dotnet

У меня есть большое регулярное выражение в виде списка слов, разделенных|. Вся длина регулярного выражения составляет 1 миллион символов.

      [RegexGenerator(@"KnownItem1|KnownItem2|KnownItem3")]
private static partial Regex NamedEntities();

Сборка с помощью сборки dotnet приводит к этой ошибке

      CSC : warning CS8785: Generator 'RegexGenerator' failed to generate source. It will not contribute to the output and co
mpilation errors may occur as a result. Exception was of type 'OutOfMemoryException' with message 'Exception of type 'S
ystem.OutOfMemoryException' was thrown.'

Процесс dotnet.exe занимал 5 ГБ ОЗУ при возникновении вышеуказанной ошибки. Как я могу добиться успеха сборки?

Я искал, как увеличить ОЗУ, используемое сборкой dotnet, как уменьшить использование ОЗУ, не выдавая символы отладки, но не нашел решения. Это также другой случай по сравнению с Regex OOM во время выполнения, о котором много раз спрашивали в StackOverflow — это ошибка времени компиляции с новым генератором исходного кода Regex. Это регулярное выражение работает в интерпретируемом режиме во время выполнения.

1 ответ

В настоящее время регулярное выражение .NET не оптимизировано для этого варианта использования. Идет обсуждение оптимизации для этого случая с Aho-Corasick .

Обходной путь теперь состоит в том, чтобы использовать Aho-Corasick и устранять перекрывающиеся совпадения вручную.

Например

helloverпри сопоставлении с регулярным выражениемhello|loverМатчи .

Однако Ахо-Корасик соответствует обоимhelloи, таким образом, вам придется отслеживать индексы и длины возвращаемых совпадений и устранятьloverчтобы имитировать поведение регулярных выражений.

Другие вопросы по тегам