Является ли java.util.regexp достаточно эффективным? - PullRequest
6 голосов
/ 10 октября 2008

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

Я подумываю использовать java.util.regexp или Jakarta perl5util (если он все еще существует, прошло несколько лет с тех пор, как я его использовал) или, возможно, поисковую систему Eclipse, хотя я сомневаюсь, что она умнее.

Есть ли существенная разница в производительности между этими двумя?

Ответы [ 3 ]

9 голосов
/ 10 октября 2008

Я не уверен, что существует огромный разрыв в производительности с точки зрения различных Java-движков регулярных выражений.

Но, безусловно, существует проблема производительности при построении регулярного выражения (то есть, если данные достаточно велики, как отметил Джефф Этвуд )

Единственное, чего вам следует избегать, это катастрофическое возвращение назад , лучше избегать при использовании атомная группировка .

Таким образом, по умолчанию я бы использовал движок java.utils.regexp, если только у вас нет определенных perl-совместимых источников регулярных выражений, которые вам нужно повторно использовать в вашей программе.

Тогда я бы тщательно построил регулярное выражение, которое я собираюсь использовать.

Но с точки зрения выбора того или иного двигателя ... как это было сказано в многих других вопросов .. .:

  • "заставь это работать, сделай это быстро - в таком порядке"
  • Остерегайтесь "преждевременной оптимизации".
3 голосов
/ 10 октября 2008

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

Для некоторых категорий существуют альтернативные библиотеки: http://jint.sourceforge.net/jint.html, которые могут иметь более высокую производительность. Опять же, это зависит от того, какую версию Java вы используете.

JDK 1.6 показывает зрелость двигателя регулярных выражений с хорошими функциями и сочетанием производительности.

2 голосов
/ 10 октября 2008

В целом, пакет java.util.regex (не "regexp") по крайней мере так же хорош, как любая другая библиотека регулярных выражений Java, включая Jakarta ORO (ваша библиотека "Perl5Util"). Кроме того, он поддерживает как атомарные группы, так и собственнические квантификаторы, которые я считаю бесценными для написания невероятно быстрых регулярных выражений. Он также поддерживает предварительно скомпилированные регулярные выражения и группы захвата, но я думаю, что это верно для всех библиотек.

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