2011-07-11 47 views
0

我在Cocoa應用程序中使用RKL從包裝任務中解析日誌語句。RegexKitLite不匹配,支持Perl的檢查程序是

模式:

(?:.+) \[.+?\] (.+) \[.+?\] 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 

每一個正則表達式測試儀,我在互聯網上嘗試成功匹配第三行和捕獲 'mikeyward'。

Objective-C代碼:

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

問題: 儘管已檢查,以確保搜索字符串是有效且包含樣本數據,RKL匹配失敗的線,更不用說捕獲的用戶名。在上面的例子中,拋出異常是因爲捕獲數組返回零對象,我沒有錯誤檢查:)

任何幫助理解爲什麼正則表達式檢查器確認匹配和捕獲,但RKL錯過它會是非常感謝。

謝謝〜

回答

0

您的匹配器只進行單行匹配。使用帶有選項的版本並通過它RKLMultiline

+0

多行模式隻影響行錨('^'和'$')的行爲,並且他沒有使用這些行。 –

0

您的問題可能與this one有關,或者它可能只是catastrophic backtracking的一種情況。我的建議在任何一種情況下都是一樣的:編寫正則表達式,因此沒有一個量詞具有重疊的影響範圍。例如:

(?m)^[ 0-9:-]+\[[A-Z]+\] (\S+) \[[^\]]+\] logged in .+$ 

在你的正則表達式,第一(?:.+)最初吃掉所有的人物都行,只是必須給他們大多回來,正則表達式的其餘部分可以有機會匹配。另一方面,[ 0-9:-]+只要看到不是空格,數字,冒號或連字符的字符就會停止使用。

如果下一個字符不是[,則不會進一步發生,整體匹配嘗試失敗的速度會比以前快得多。同樣的,[A-Z]+不能吹過關閉]\S+不能超越下一個空格,並且[+] + stops before the next] +因爲它已經做了我們想要的東西了,也就是說,消耗所有的字符,直到下一個換行符或文本的結尾。

無論如何,我會寫這個正則表達式,但出於好奇,如果你離開你的正則表達式,但添加行錨?

(?m)^(?:.+) \[.+?\] (.+) \[.+?\] logged in (?:.+)$ 

它仍然是令人髮指的效率不高,但它可能使之間的差異不工作嚴重工作。 :D