为什么这个Regex结果出乎意料

时间:2014-05-23 03:10:39

标签: ruby regex

有问题的正则表达式是

/(<iframe.*?><\/iframe>)/

我正在使用这个ruby正则表达式来匹配字符串的各个部分,然后创建一个结果数组。

字符串是

"<p><iframe src=\"http://www.dailymotion.com/embed/video/k18WBkRTMldXzB7JYW5?logo=0&#038;info=0\" frameborder=\"0\" height=\"450\" width=\"580\"></iframe></p>\n<p>#1<br />\n<iframe src=\"https://www.cloudy.ec/embed.php?id=cabe5d3ba31da\" allowfullscreen=\"\" frameborder=\"0\" height=\"420\" width=\"640\"></iframe></p>\n<p>#2<br />\n<iframe src=\"https://www.cloudy.ec/embed.php?id=b03d31e4b5663\" allowfullscreen=\"\" frameborder=\"0\" height=\"420\" width=\"640\"></iframe></p>\n<p>#3<br />\n<iframe src=\"https://www.cloudy.ec/embed.php?id=f63895add1aac\" allowfullscreen=\"\" frameborder=\"0\" height=\"420\" width=\"640\"></iframe></p>\n"

我正在调用正则表达式.match()就像这样

/(<iframe.*?><\/iframe>)/.match(entry.content).to_a

结果是第一场比赛的重复

["<iframe src=\"http://www.dailymotion.com/embed/video/k18WBkRTMldXzB7JYW5?logo=0&#038;info=0\" frameborder=\"0\" height=\"450\" width=\"580\"></iframe>", "<iframe src=\"http://www.dailymotion.com/embed/video/k18WBkRTMldXzB7JYW5?logo=0&#038;info=0\" frameborder=\"0\" height=\"450\" width=\"580\"></iframe>"]

我使用了Rubular,我能够让Regex在那里工作http://rubular.com/r/CYF0vgQtrX

2 个答案:

答案 0 :(得分:2)

  

结果是第一场比赛的重复

即使Regex #matre()的文档做了一个描述match()操作的糟糕工作,它实际上找到第一个匹配:

str = "abc"
md = /./.match(str)
p md.to_a

--output:--
["a"]

当匹配时,Regexp.match()返回MatchData对象。 MatchData对象包含整个匹配和每个组的匹配项。如果在MatchData对象上调用to_a(),则返回值是一个包含整个匹配的数组,以及正则表达式中每个组匹配的任何内容:

str = "abc"
md = /(.)(.)(.)/.match(str)
p md.to_a

--output:--
["abc", "a", "b", "c"]

由于您在正则表达式中指定了一个组,因此一个结果是整个匹配,另一个结果是与您的组匹配的结果。

  

[正则表达式]是我想到的第一种方法。如果这不是   工作,然后我打算使用nokogiri

从现在开始,nokogiri应该是你的第一个想法...因为:

  

如果您遇到编程问题,并且您认为,&#34;我将使用正则表达式&#34;,   现在你有两个问题&#34;。

答案 1 :(得分:1)

您应该在这里使用scan代替match

entry.content.scan(/<iframe.*?><\/iframe>/)

使用/(<iframe.*?><\/iframe>)/将得到一个二维数组。该文件说:

  

如果模式包含组,则每个单独的结果本身就是一个包含每个组一个条目的数组。