Рекомендации по оптимизации производительности Regex
После прочтения довольно хорошей статьи о оптимизации regex в java мне было интересно, какие еще хорошие советы для создания быстрых и эффективных регулярных выражений?
Ответы
Ответ 1
- Используйте группу non-capture
(?:pattern)
, когда вам нужно повторить группировку, но не нужно использовать захваченное значение, которое приходит из традиционной группы (capturing)
.
- Используйте атомную группу (или подвыражение без обратного отслеживания), если применимо
(?>pattern)
.
- Избегайте катастрофического обратного отслеживания, как чума, создавая регулярные выражения для раннего завершения для не-матчей.
Я создал видео, демонстрирующее эти методы. Я начал с очень плохо написанного регулярного выражения в катастрофическом обратном отслеживании статьи (x+x+)+y
. И затем я сделал это в 3 миллиона раз быстрее после серии оптимизаций, бенчмаркинга после каждого изменения. Видеоролик относится к .NET, но многие из этих вещей применимы и к большинству других ароматизаторов регулярных выражений:
Урок .NET Regex: №5: Оптимизация
Ответ 2
Используйте любой (точка) оператор экономно, если вы можете сделать это любым другим способом, сделайте это, точка всегда будет укусить вас...
Я не уверен, является ли PCRE NFA, и я знаком с PCRE, но + и * обычно жадные по умолчанию, они будут соответствовать как можно больше, чтобы использовать это для использования +? а также *? чтобы соответствовать наименее возможным, помните эти два предложения при написании вашего регулярного выражения.
Ответ 3
Знайте, когда не использовать регулярное выражение - иногда решение с ручной кодировкой является более эффективным и понятным.
Пример: предположим, что вы хотите сопоставить целое число, которое равномерно делится на 3. Тривиально, чтобы создать конечный конечный автомат, чтобы выполнить это, и поэтому соответствующее регулярное выражение должно существовать, но его выписывание не так тривиально - и я "Конечно, ненависть должна отлаживать его!