1

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

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

4

2 回答 2

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
于 2013-08-27T19:36:55.050 回答
1

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

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

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

(感谢#union 方法的“mu 太短”的评论)

对于您描述的特定情况,所有正则表达式都以“pre”和可选冒号等开头,然后您可以执行 /pre:? +(star|moon|sun)/ 并使用匹配结果找出匹配的。

Ruby 的 Regexp 是使用搜索树实现的;有一个有趣的描述可能会给你带来线索:

于 2012-10-03T04:21:11.507 回答