Не тот ленивый матч с регулярными выражениями? - PullRequest
2 голосов
/ 24 февраля 2009

У меня есть класс C # Regex, соответствующий нескольким подгруппам, например

(?<g1>abc)|(?<g2>def)|(?<g3>ghi) 

но с гораздо более сложными подшаблонами. Я в основном хочу сопоставить все, что не принадлежит ни одной из этих групп, в дополнение к существующим группам.

Я пытался

(?<g1>abc)|(?<g2>def)|(?<g3>ghi)|(.+?) 

но получилось слишком медленно. Я не могу сделать отрицание, потому что я не хочу копировать эти сложные подшаблоны избыточно. Использование just (. +) Переопределяет все остальные группы, как и ожидалось.

Есть ли другой способ? Если это не сработает, мне придется написать специальный анализатор.

Дополнительные сведения: Все эти группы оцениваются с помощью MatchEvaluator. Поэтому поведение класса Regex, которое отправляет «несопоставленные строки» в MatchEvaluator, также будет работать.

Пример текста будет

.......abc........ghi.....def.....abc....def...ghi......abc.......

Я хочу поймать промежуточные части.

Ответы [ 4 ]

2 голосов
/ 24 февраля 2009

Ваше регулярное выражение генерирует отдельное совпадение для каждого символа за пределами g1, g2, g3. Поэтому, когда вы используете его с MatchEvaluator, он генерирует много вызовов оценщика. Вот почему это медленно.

Если вы попробуете следующее регулярное выражение:

(?<rest>.*?)((?<g1>abc)|(?<g2>def)|(?<g3>ghi)|$)

вы получите одно совпадение группы "rest" для всего фрагмента текста, который не содержит группу "g".

код Regex C #:

Regex regex = new Regex(
    @"(?<rest>.*?)((?<g1>abc)|(?<g2>def)|(?<g3>ghi)|$)",
    RegexOptions.Singleline
    | RegexOptions.Compiled
    );
2 голосов
/ 24 февраля 2009

но получилось слишком медленно. Я не могу сделать отрицание, потому что я не хочу копировать эти сложные субпаттерны избыточно.

Почему бы не что-то вроде:

const string COMPLEX_REGEX_PATTERN = "\Gobbel[dy]go0\k"

1 голос
/ 24 февраля 2009

Вы пытались установить параметр регулярного выражения для компиляции? Я считаю, что использование статического скомпилированного регулярного выражения может значительно ускорить процесс.

0 голосов
/ 24 февраля 2009

Если ваше регулярное выражение содержит четыре страницы, лучше написать собственный конечный автомат ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...