2017-09-01 72 views
2

我有幾百個字符串列表和10K的正則表達式的數組。斯威夫特3:最高效的方法來檢查許多字符串與許多正則表達式

我現在要遍歷所有字符串,並檢查其10K正則表達式匹配。什麼是最高效的方式來做到這一點?

目前我在做這個:

myRegularExpression.firstMatch(in: myString, options: myMatchingOption, range: NSMakeRange(0, myString.characters.count)) == nil 

其中myRegularExpression是存放重用一個NSRegularExpressionmyMatchingOptionNSRegularExpression.MatchingOptions(rawValue: 0)

有沒有檢查一個字符串相匹配的一個更快,更高性能的方式那10K正則表達式?

編輯:

我需要知道的不僅是如果我10k的正則表達式配合也是其中之一。所以,目前我在for循環中有一個for循環:外部循環遍歷我的幾百個字符串,對於每個字符串,我循環遍歷我的10k規則,看看是否有一條規則適合(當然,如果適合我可以停止對於字符串,所以大致爲:

for string in stringsToCheck { 
    for rule in myRules { 
     if string.matches(rule) { 
      // continue with next string of stringsToCheck 
     } 
    } 
} 
+0

你可以排除字符串和/或regices的組(即,你有數據中的已知模式?)。 regexrunner可能針對給定的正則表達式和字符串進行了大量優化,但它無法知道您的數據,例如如果您有多個使用^或$的註冊表,您可以將第一個或最後一個字母的所有字符串分組,並排除一組不匹配的字符串。另外,預編譯可能的regices? –

+0

您是否嘗試通過將所有正則表達式合併爲一個單一表達式來構建一個大型表達式,其中| ?不確定解析器是否能夠存活10,000個模式,但即使將它們同時組合10個或20個,也可以獲得一些性能改進。 –

+0

@LoveTätting感謝您的回覆,請參閱我的編輯... – swalkner

回答

0

取決於你在運行的平臺這一點,在使用多個線程可能會提供一些響應時間的改善分離工作,但我相信,這真的是戲劇性的優化將需要一些有識之士對正則表達式的性質。

例如,如果表達式不具有特定的優先順序,你可以重新排列(重新排序),他們做出了最有可能的「匹配」 COM首先在列表中。這可以通過表達式的提供者或者使用某種函數來估計它們的複雜性(例如表達的長度,可選或組合符號的存在)來預先評估。 或者可以通過收集(並持續)每個表達式的命中/未命中計數來對其進行統計評估。但是,當然這樣的優化假定每個字符串至少匹配一個表達式,並且80/20規則適用(即,20%的表達式匹配80%的字符串)。

如果表情都很簡單,只使用字母紋樣,然後你會得到與匹配的功能更「手動」的實現(而不是正則表達式)更好的性能。在最好的情況下,簡單的字母模式可以轉換成字符樹,並在性能改進中產生數量級的數據。

注意,這些解決方案不是相互排斥的。例如,如果大部分表達式都是簡單模式,而且只有少數表達式具有複雜模式,那麼您不必使用洗澡水丟棄嬰兒:您可以將簡單模式優化應用於規則的子集,並且使用「強力」嵌套循環到其餘複雜的循環。

我在過去成千上萬的規則將需要處理保險索賠幾十萬的記錄,可以使用相同的問題。傳統的「專家系統」方法是創建一個規則列表並通過它運行每條記錄。顯然這需要很長的時間(比如2個月的執行時間來處理一個月的索賠)。用低於「純粹」的心態來看待它,我能夠說服我的客戶規則應該按層次進行定義。所以我們將它們分成一組資格規則和一組決策規則。然後我們通過創建資格團體和決策團隊來進一步完善結構。我們最終得到的是一個粗糙的樹狀結構,其中規則允許系統縮小應該應用於給定記錄的規則的數量。因此,將250,000條記錄的6周處理時間縮減爲7個小時(這是在1988年你記住的)。

這一切都可以說退一步回到解決問題的本質可能會提供一些優化機會,這些機會在僅僅考慮一個過程選項的機制時是不可見的。