2009-12-26 2 views
10

Существуют ли какие-либо (бесплатные) механизмы регулярных выражений для Java, которые могут компилировать регулярное выражение в DFA и выполнять групповой захват при сопоставлении DFA?Регулярные выражения для DFA для Java с Capture

Я нашел dk.brics.automaton и jrexx, которые оба компилируются в DFA, но, похоже, они не могут выполнять групповой захват. В то время как другие найденные мной двигатели, похоже, компилируются в NFA.

+1

Зачем вам нужен DFA? –

+1

Для оптимизации производительности. – Sami

+3

Я спрашиваю, потому что обычно эти преимущества исполнения возникают из-за неспособности двигателей DFA к возврату. Если это так, возможно, вы могли бы достичь того же, используя атомные группировки/обладающие квантификаторами. Может быть, вы можете опубликовать несколько примеров того, чего вы хотите достичь? –

ответ

-2

вы можете попробовать Pat regular expressions library @http://www.javaregex.com/.

+0

С веб-сайта, по крайней мере, не очевидно, что этот движок будет основан на DFA, и что он будет поддерживать групповой захват. Если это так и есть, не могли бы вы подтвердить. – Sami

+0

Это lib (Stevesoft Pat) поддерживает группы захвата, но это определенно ** не ** основано на DFA. –

0

Для C есть TRE и библиотеки Google RE2. TRE использует DFA, RE2 использует NFA (насколько я понимаю), оба могут совпадать между подгруппами. Но я не видел такую ​​библиотеку для Java.

+1

RE2 действительно ДЕЙСТВИТЕЛЬНО быстрый. Стоит обратить на это внимание, когда люди просят регулярное выражение и скорость. – nes1983

+1

У вас это перепутано. TRE использует NFA, RE2 использует как NFA, так и DFA. В частности, RE2 использует DFA, если имеется не более одной группы захвата, иначе NFA. – nes1983

3

попробовать это (возможно, не DFA, но быстрее, чем java.util) http://jregex.sourceforge.net/gstarted-advanced.html#ngroups, или это один: http://userguide.icu-project.org

согласно этому испытанию: http://tusker.org/regex/regex_benchmark.html, как быстро (все мы знаем, что контрольные тесты только то, что создатель теста хотел проверить).

Когда мне нужно было очень быстрое регулярное выражение DFA, я породил процесс, который использовал grep ;-) (для файла журнала объемом 6 ГБ он сокращает время от 10 минут до нескольких секунд).

+0

Я сомневаюсь, что это быстрее, чем java.util.regex. Эти небольшие библиотеки приходят и уходят, java.util.regex оптимизируется из года в год. Если вы не используете лучший алгоритм, java.util.regex в конечном итоге побьет вас. См. Мой ответ для механизма регулярных выражений, который принципиально отличается от java.util.regex, основанного на DFA и, следовательно, быстрее. – nes1983

-2

dk.brics.automaton - это DFA, похоже, выполняет группы захвата. Я ожидаю, что эта функция будет новой в течение двух лет с момента этого вопроса. Проверьте класс AutomatonMatcher.

См http://www.brics.dk/automaton/doc/dk/brics/automaton/AutomatonMatcher.html#group(int)

+0

Он фактически не поддерживает групповое сопоставление. – nes1983

+0

Обновлено ссылкой на API-интерфейс группового захвата –

+0

Да, но вы прочитали эту ссылку? «не поддерживает группы захвата, единственной допустимой группой является 0 (весь матч)». – nes1983

Смежные вопросы