RegexKitLite не соответствует, Perl-поддерживаемые контролеры - PullRequest
0 голосов
/ 11 июля 2011

Я использую RKL в приложении Какао для анализа операторов журнала из обернутой задачи.

Шаблон:

(?:.+) \[.+?\] (.+) \[.+?\] logged in (?:.+)

Тестовые данные:

2011-07-11 00:48:19 [INFO] Preparing spawn area: 97
2011-07-11 00:48:19 [INFO] Done (2175837000ns)! For help, type "help" or "?"
2011-07-11 00:48:42 [INFO] mikeyward [/127.0.0.1:59561] logged in with entity id blahblah

Каждый тестер RegEx, который я пробовал в Интернете, успешно соответствует третьей строке и записывает «mikeyward».

Код Objective-C:

NSString *loggedInPattern = @"(?:.+) \\[.+?\\] (.+) \\[.+?\\] logged in (?:.+)";
NSArray *captures = [searchString arrayOfCaptureComponentsMatchedByRegex:loggedInPattern];
NSString *username = [captures objectAtIndex:0];

Проблема: Несмотря на проверку того, что searchString действительна и содержит примеры данных, RKL не соответствует строке, не говоря уже о захвате имени пользователя.В приведенном выше примере выдается исключение, потому что массив capture возвращается с нулевыми объектами, и я не проверяю ошибки:)

Любая помощь в понимании того, почему контролеры регулярных выражений подтверждают совпадение и захват, но RKL пропускает егобудет очень признателен.

Спасибо ~

Ответы [ 2 ]

0 голосов
/ 11 июля 2011

Ваша проблема может быть связана с этой , или это может быть просто случай катастрофического возврата .Мой совет был бы одинаковым в любом случае: напишите регулярное выражение, чтобы ни один из квантификаторов не имел перекрывающихся интервалов влияния.Например:

(?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

0 голосов
/ 11 июля 2011

Ваш сопоставитель выполняет сопоставление только одной строки. Используйте версию с опциями и передайте ее RKLMultiline

...