我有一个正则表达式数组和一个字符串数组。阵列的大小可以任意长(例如,100或1000)。没有字符串匹配两个不同的正则表达式。我不确定我将如何执行它,但让我们假设它在那里。正则表达式以pre
开头,后跟可选冒号,后跟一个或多个空格,后跟一个特定字符串,后跟一个空格,后跟一个整数。它将不区分大小写。
regexes = [/pre: my_string (\d+)/i, /pre: another (\d+)/i]
strings = ["comet", "eclipse", "sunshine", "starlight", "moonlight"]
对于每个字符串,我想检查它匹配的正则表达式并返回相应的匹配项。 上面的示例代码演示了我当前的方法。
strings.each {|string|
regexes.each {|regex|
if regex.match(string)
p regex.match(string)
break
end
}
}
似乎效率低下。有什么更有效的方法来实现它?
答案 0 :(得分:1)
不要使用一组正则表达式;相反,使用搜索树。
这是一篇很棒的介绍文章:用于排序和搜索字符串的快速算法。
或者如果您更喜欢快速而肮脏的解决方案,您可以使用Ruby Regexp#union将fuseregexps融合在一起创建一个大的。这可能会更有效地检测字符串的 none 何时匹配,并且您可以对其进行基准测试。如果匹配,则使用匹配位置来确定哪个正则表达式匹配。
(感谢#union方法的“mu太短”的评论)
对于您描述的特定情况,所有正则表达式以“pre”和可选冒号等开头,那么您可以执行/ pre:? +(star | moon | sun)/并使用匹配结果找出匹配的内容。
Ruby的Regexp是使用搜索树实现的;这里有一个有趣的描述可能会给你带来优势:
答案 1 :(得分:1)
我将只包含一个Regexp.union()
的示例desired = Regexp.union(/RM/, /dog/, /hat/)
x = "RM20"
y = "phat"
puts "rawr!" if y =~ desired
#=> rawr!
puts "match!" if x =~ desired
#=> match