Улучшить производительность Java Regex - PullRequest
2 голосов
/ 20 января 2012

Я ищу способ улучшить это регулярное выражение:

^(?:([^.]+).?){6}_tid

Это извлекает 6-е поле из point.separated.string.of.arbitrary.lengths до "_tid"

Итак, если это выглядит так:

mc11_7tev.138345.dgnol_tb6_m12u_140_140_110_2l_jimmy_susy.evgen.log.e825_tid431423_0

должно вернуть

e825

Как ни странно, если я удаляю часть _tid регулярного выражения ^(?:([^.]+).?){6}, я получаю требуемую производительность ... 1-2 секунды для проверки миллиона строк. С _tid .. это занимает до 5 минут.

Есть ли лучший способ сделать это?


EDIT: Ах, я забыл упомянуть, это в Apache Pig, поэтому все должно быть в предложении регулярных выражений.

Ответы [ 4 ]

1 голос
/ 20 января 2012

Это дает мне лучшие результаты производительности:

    Pattern p = Pattern.compile(".*\\.([^_]+)_tid.*");
1 голос
/ 20 января 2012

Вы забыли уйти от точки, попробуйте это

^(?:([^.]+)\.?){6}_tid

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

Другая возможность, которую я вижу, - избавление от необязательной точки

^(?:[^.]+\.){5}([^.]+)_tid

См. здесь здесь, в Regexr

1 голос
/ 20 января 2012

Этот, кажется, работает быстрее, чем ваш:

^(?:[^.]+\.){5}([^.]+)_tid
1 голос
/ 20 января 2012

Я бы сначала разделил строку на ., получил 6-ю часть, разделил ее на _, получил бы первую часть:

s.split("\.")[5].split("_")[0];

Не проверено!

...