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

时间:2012-10-03 03:39:41

标签: ruby regex

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

似乎效率低下。有什么更有效的方法来实现它?

2 个答案:

答案 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