String.scan在Ruby中返回空数组

时间:2011-07-16 18:02:07

标签: ruby regex

我在Ruby中编写了一个非常基本的正则表达式,用于从网上抓取电子邮件地址。它看起来如下:

/\b\w+(\.\w+)*@\w+\.\w+(\.\w+)*\b/

当我将其加载到irb或rubular时,我创建以下字符串:

"example@live.com"

当我在irb中运行Regexp.match(string)命令时,我得到了这个:

regexp.match(string) =>#<MatchData "example@live.com" 1:nil 2:nil>

所以匹配似乎记录在MatchData对象中。但是,当我运行String.scan(regex)命令(这是我最感兴趣的)时,我得到以下内容:

string.scan(regex) => [[nil, nil]]

为什么不扫描返回匹配的电子邮件地址?这是正则表达式的问题吗?或者是否有人能让我知道String.scan / Regexp / MatchData的细微差别?

1 个答案:

答案 0 :(得分:3)

主要问题是您的捕获组(与括号中的任何内容匹配的东西)无法捕获您想要的内容。

假设您只想要用户名和域名。你应该使用/\b(\w+(?:\.\w+)*)@(\w+(?:\.\w+)*)\.\w+\b/的内容。就目前而言,您的模式与输入文本匹配,但组实际上并不捕获任何文本。

另外,为什么不使用/([\w\.]+)@([\w\.]+)\.\w+/? (不太熟悉ruby的正则表达式引擎,但这应该是正确的......如果你使用贪婪的量词,你甚至不需要检查单词边界)