Ruby 检查字符串是否与任何正则表达式匹配

Ruby 检查字符串是否与任何正则表达式匹配,ruby,regex,Ruby,Regex,我有一个正则表达式数组和一个字符串数组。阵列的大小可以任意长(例如,100或1000)。没有字符串匹配两个不同的正则表达式。我不确定我将如何执行它,但让我们假设它就在那里。正则表达式以pre开头,后跟可选冒号,后跟一个或多个空格,后跟特定字符串,后跟单个空格,后跟整数。它将不区分大小写 regexes = [/pre: my_string (\d+)/i, /pre: another (\d+)/i] strings = ["comet", "eclipse", "sunshine", "sta

我有一个正则表达式数组和一个字符串数组。阵列的大小可以任意长(例如,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
  }
}

这似乎效率低下。实现这一点更有效的方法是什么?

不要使用正则表达式数组;相反,使用搜索树

这是一篇很棒的介绍文章:用于排序和搜索字符串的快速算法

或者,如果您喜欢一个快速而肮脏的解决方案,您可以使用Ruby Regexp#union将eGexps融合在一起,创建一个大的解决方案。这可能会更有效地检测字符串是否匹配,您可以对其进行基准测试。如果匹配,则使用匹配位置确定哪个正则表达式匹配

(感谢“mu太短”对“联合法”的评论)

对于您描述的特定情况,如果所有regexp都以“pre”和可选冒号等开头,那么您可以执行/pre:+(星|月|日)/并使用匹配结果找出匹配的

Ruby的Regexp是使用搜索树实现的;这里有一个有趣的描述,可以为您提供线索:


我将只包含一个Regexp.union()的示例


正则表达式是否遵循任何类型的模式,或者它们是否完全通用?是的,我目前在设计中有一个特定的模式。我已经包括了它的一个描述。你在乎哪个特定的正则表达式匹配吗?不。只要返回第一个匹配,然后继续。可能重复的你不需要任何猴子补丁,当你有。@mu你完全正确-很好的一点,这正是StackOverflow如此伟大的原因。谢谢
desired = Regexp.union(/RM/, /dog/, /hat/)
x = "RM20"
y = "phat"
puts "rawr!" if y =~ desired
#=> rawr!
puts "match!" if x =~ desired
#=> match