正则表达式:评估部分表达式

时间:2011-06-21 17:32:53

标签: ruby regex

让我们说

sometext= "text text picture 1 picture 2 text text"

我想写一个表达式,在图片和前两张图片之前抓取文本块。有时候只会有一张照片,但可能只有五张。

我的第一次尝试是

parsed = sometext.scan(/picture.*?(picture.*?(?=picture))

但是,如果有语句,Ruby似乎不支持Regex。

[我编辑了这个问题以使其更清晰。]

2 个答案:

答案 0 :(得分:3)

以下是各种解决方案,所有这些解决方案都给出了相同的结果:

ids = sometext.scan(/picture (\d+)/).flatten.map(&:to_i)
ids = sometext.scan(/(picture (\d+))/).map{ |str,id| id.to_i }
ids = sometext.scan(/(picture (\d+))/).map(&:last).map(&:to_i)
p ids
#=> [1, 2]

答案 1 :(得分:0)

这就是我最后做的事情。我在一行代码中抓住了整个块并将其粘贴在一个数组中。

var = sometext.scan(/goodtext.*?endofsection/m)

然后在另一行中从一个块中取出一个数组。我知道标题是第一个,然后是一个未确定数量的图片,所以我将数组限制为三个项目。

var = var.collect{|x| x.scan(/heading|image).slice(0..2)}

我需要通过gsub更多地改进这些我不需要的其他东西,但我认为这将满足我的标准。如果其他任何人都能想到更优雅的方式,我就是全力以赴。