斯威夫特3:最高效的方法来检查许多字符串与许多正则表达式

问题描述:

我有几百个字符串列表和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

取决于你在运行的平台这一点,在使用多个线程可能会提供一些响应时间的改善分离工作,但我相信,这真的是戏剧性的优化将需要一些有识之士对正则表达式的性质。

例如,如果表达式不具有特定的优先顺序,你可以重新排列(重新排序),他们做出了最有可能的“匹配” COM首先在列表中。这可以通过表达式的提供者或者使用某种函数来估计它们的复杂性(例如表达的长度,可选或组合符号的存在)来预先评估。 或者可以通过收集(并持续)每个表达式的命中/未命中计数来对其进行统计评估。但是,当然这样的优化假定每个字符串至少匹配一个表达式,并且80/20规则适用(即,20%的表达式匹配80%的字符串)。

如果表情都很简单,只使用字母纹样,然后你会得到与匹配的功能更“手动”的实现(而不是正则表达式)更好的性能。在最好的情况下,简单的字母模式可以转换成字符树,并在性能改进中产生数量级的数据。

注意,这些解决方案不是相互排斥的。例如,如果大部分表达式都是简单模式,而且只有少数表达式具有复杂模式,那么您不必使用洗澡水丢弃婴儿:您可以将简单模式优化应用于规则的子集,并且使用“强力”嵌套循环到其余复杂的循环。

我在过去成千上万的规则将需要处理保险索赔几十万的记录,可以使用相同的问题。传统的“专家系统”方法是创建一个规则列表并通过它运行每条记录。显然这需要很长的时间(比如2个月的执行时间来处理一个月的索赔)。用低于“纯粹”的心态来看待它,我能够说服我的客户规则应该按层次进行定义。所以我们将它们分成一组资格规则和一组决策规则。然后我们通过创建资格团体和决策团队来进一步完善结构。我们最终得到的是一个粗糙的树状结构,其中规则允许系统缩小应该应用于给定记录的规则的数量。因此,将250,000条记录的6周处理时间缩减为7个小时(这是在1988年你记住的)。

这一切都可以说退一步回到解决问题的本质可能会提供一些优化机会,这些机会在仅仅考虑一个过程选项的机制时是不可见的。