Ваша проблема может быть связана с этой , или это может быть просто случай катастрофического возврата .Мой совет был бы одинаковым в любом случае: напишите регулярное выражение, чтобы ни один из квантификаторов не имел перекрывающихся интервалов влияния.Например:
(?m)^[ 0-9:-]+\[[A-Z]+\] (\S+) \[[^\]]+\] logged in .+$
В вашем регулярном выражении первый (?:.+)
изначально сожирает все символы в строке, только для того, чтобы вернуть большинство из них, чтобы остальная часть регулярного выражения могла иметь шансчтобы соответствовать.[ 0-9:-]+
, с другой стороны, перестает потреблять, как только он видит символ, который не является пробелом, цифрой, двоеточием или дефисом.
Если следующий символ не является [
, он не идет дальше, и попытка совпадения в целом проваливается гораздо быстрее, чем раньше.Точно так же, [A-Z]+
не может пройти мимо закрытия ]
, \S+
не может заполнить следующий пробел и [^]] + stops before the next
] . I didn't change the final
. + `, Потому что он уже делает то, что мы хотимто есть потреблять все символы до следующего символа новой строки или до конца текста.
Вот как бы я написал регулярное выражение в любом случае, но просто из любопытства, что произойдет, если вы оставите свое регулярное выражениекак это, но добавить якоря линии?
(?m)^(?:.+) \[.+?\] (.+) \[.+?\] logged in (?:.+)$
Это все еще ужасно неэффективно, но может иметь значение между не работает и работает плохо .: D