只有在字符串中找到一次URL时,ruby正则表达式才需要匹配

时间:2010-02-13 15:35:51

标签: ruby regex

我正在尝试添加条件逻辑,以确定字符串中的URL是否与 一个 正则表达式匹配。以下是字符串的示例:

string_to_match = "http://www.twitpic.com/23456 ran to catch the bus, http://www.twitpic.com/3456 dodged a bullet at work."

如果我确定字符串中有一个网址,我只想匹配,因此在我尝试解决的情况下,上面的字符串不会匹配。我觉得这样的事情会奏效:

if string_to_match =~  /[http\:\/\/]?/
   puts "you're matching more then once. bad man!"
end

但事实并非如此!如何确定字符串中只有一个匹配项?

3 个答案:

答案 0 :(得分:2)

Mladen的答案很好(计算scan的回报),但正则表达式已经包含多次或特定次数匹配同一事物的想法。在您的情况下,如果文本出现2次或更多次,则需要打印警告:

/(http:\/\/.+?){2,}/

使用.+.*,具体取决于您是否要求网址包含某些内容。就目前而言,.+?将以非贪婪的方式匹配1个或多个字符,这就是您想要的。一个贪婪的量词会在第一次尝试时吞噬整个字符串,然后在最终找到多个URL之前必须做一堆回溯。

答案 1 :(得分:1)

你可以这样做:

if string_to_match =~ /((http:\/\/.*?)http:\/\/)+/

仅当您有2次(或更多次)http://

时才会匹配

答案 2 :(得分:1)

看看String#scan,您可以这样使用它:

if string_to_match.scan(/[http\:\/\/]/).count > 1
   puts "you're matching more then once. bad man!"
end