2011-11-05 76 views
1

使用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将是一个好主意。

这是可能的,或者可以通过其他方式完成?

+0

题外话,但它与Ruby的正则表达式,而不是Rails。 –

+0

我曾经认为可能是这种情况。对不起,会正确的。 – d3vkit

回答

3

试试这个关于大小

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

它说的是找出所有启动(不区分大小写)与任何标题,作者或页面结果,然后跟着一个冒号和选项的白色空间,然后字符。捕获标签,然后捕获空白符后面的字符。扫描方法将尽可能匹配。

+0

+1;比我的好多了。 –

+0

尽管@scott ripley使用的方法更接近我想要做的事情(使用连接将数组变为一个字符串),但这很好解释了这一点,我认为值得胜利。感谢所有的好主意! – d3vkit

+0

在我用同样的正则表达式回答之后,我意识到如果文本在“奇怪的地方”有换行符,这将不起作用。所以请看看我的新答案。 –

1

只是遍历匹配的单词,并执行正常的比较,因为你通常会。

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

但是,如果你知道你关心的事情是在线条的开头,然后劈在\n输入字符串,只需使用start_with,而不是用正则表达式困扰 - 这部分地取决于什么真实的数据看起来像。

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开关,以指示要.匹配换行符。

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

+0

感谢你的想法,非常接近 - 尽管\ m通过使比赛超出换行符实际上导致了问题(结果类似于[“title”,“jurassic park \ nauthor:”],但实际上它是这样的:D – d3vkit

+0

嗯,现在我想到了,'/ m'需要得到像'Jurassic \ nPark'这样的结果,但是它失败了,因为表达式太贪婪。我会用这个解决方案更新我的答案。 –

相关问题