Рекомендации по оптимизации производительности Regex

После прочтения довольно хорошей статьи о оптимизации regex в java мне было интересно, какие еще хорошие советы для создания быстрых и эффективных регулярных выражений?

Ответы

Ответ 1

  • Используйте группу non-capture (?:pattern), когда вам нужно повторить группировку, но не нужно использовать захваченное значение, которое приходит из традиционной группы (capturing).
  • Используйте атомную группу (или подвыражение без обратного отслеживания), если применимо (?>pattern).
  • Избегайте катастрофического обратного отслеживания, как чума, создавая регулярные выражения для раннего завершения для не-матчей.

Я создал видео, демонстрирующее эти методы. Я начал с очень плохо написанного регулярного выражения в катастрофическом обратном отслеживании статьи (x+x+)+y. И затем я сделал это в 3 миллиона раз быстрее после серии оптимизаций, бенчмаркинга после каждого изменения. Видеоролик относится к .NET, но многие из этих вещей применимы и к большинству других ароматизаторов регулярных выражений:

Урок .NET Regex: №5: Оптимизация

Ответ 2

Используйте любой (точка) оператор экономно, если вы можете сделать это любым другим способом, сделайте это, точка всегда будет укусить вас...

Я не уверен, является ли PCRE NFA, и я знаком с PCRE, но + и * обычно жадные по умолчанию, они будут соответствовать как можно больше, чтобы использовать это для использования +? а также *? чтобы соответствовать наименее возможным, помните эти два предложения при написании вашего регулярного выражения.

Ответ 3

Знайте, когда не использовать регулярное выражение - иногда решение с ручной кодировкой является более эффективным и понятным.

Пример: предположим, что вы хотите сопоставить целое число, которое равномерно делится на 3. Тривиально, чтобы создать конечный конечный автомат, чтобы выполнить это, и поэтому соответствующее регулярное выражение должно существовать, но его выписывание не так тривиально - и я "Конечно, ненависть должна отлаживать его!