0

我在 Cocoa 应用程序中使用 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 无法匹配该行,更不用说捕获用户名了。在上面的示例中,抛出异常是因为返回的 captures 数组包含零个对象,并且我没有进行错误检查:)

任何帮助理解为什么正则表达式检查器确认匹配并捕获但 RKL 错过了它,我们将不胜感激。

谢谢~

4

2 回答 2

0

您的匹配器仅进行单行匹配。使用带有选项的版本并通过它RKLMultiline

于 2011-07-11T05:50:54.503 回答
0

您的问题可能与有关,或者可能只是灾难性回溯的情况。在任何一种情况下,我的建议都是相同的:编写正则表达式,这样任何量词都没有重叠的影响范围。例如:

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

于 2011-07-11T09:24:22.550 回答