正则表达式匹配直到包含在数组中的单词

时间:2011-11-05 00:32:52

标签: ruby regex

使用Ruby 1.8.7

我需要抓住某些单词的所有内容 - 我希望与数组中的单词匹配。例如:

match_words = ['title','author','pages']
item = "Title: Jurassic Park\n"
item += "Author: Michael Crichton\n"

if item =~ /title: (.*)#{match any word in match_words array}/i
  #do something here
end

所以,这将理想地回归“侏罗纪公园\ n”。我目前正在匹配新行,但发现我将匹配的数据可能在奇怪的地方有新行,比如句子的中间部分。所以,我认为匹配下一个match_word将是一个好主意。

这是可能的,还是可以用另一种方式完成?

3 个答案:

答案 0 :(得分:3)

尝试使用尺寸

item.scan(/(title|author|pages):\s*?(.+)/i)

这说明找到所有以标题,作者或页面开始(不区分大小写)的结果,然后是冒号和选项空格,然后是字符。捕获标签,然后捕获空格后面的字符。扫描方法将尽可能多地匹配。

答案 1 :(得分:1)

只需迭代匹配单词并按正常情况进行正则表达式比较。

match_words.each do |word|
    if item =~ /#{word}/  # Plus case sensitivity, start/end of item, etc.
        # etc.
    end
end

但是如果你知道你关心的事情是在行的开头,那么将输入字符串拆分为\n并使用start_with而不是打扰正则表达式 - 部分取决于真实数据的样子。

答案 2 :(得分:0)

首先,从|创建一个match_words分隔的关键字列表。 然后,使用string.scan拆分字符串,为您提供包含结果的数组数组。 See the end of this tutorial for a reference.

这是我最好的镜头:

keywords = match_words.join('|')
results = item.scan(/(#{keywords}):\s*(.+?)\s*(?= (#{keywords}):)/im)

结果:[["Title", "Jurassic Park"], ["Author", "Michael Crichton"]]

不要忘记使用/m开关来表示您希望.匹配换行符。

要解释模式:我们会查找关键字,然后使用“向前看”(?= )来查找下一个关键字而不捕获它。我们使用“懒惰”表达式.+?捕获其间的所有字符,以便我们不捕获其他关键字。