我在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的细微差别?
答案 0 :(得分:3)
主要问题是您的捕获组(与括号中的任何内容匹配的东西)无法捕获您想要的内容。
假设您只想要用户名和域名。你应该使用/\b(\w+(?:\.\w+)*)@(\w+(?:\.\w+)*)\.\w+\b/
的内容。就目前而言,您的模式与输入文本匹配,但组实际上并不捕获任何文本。
另外,为什么不使用/([\w\.]+)@([\w\.]+)\.\w+/
? (不太熟悉ruby的正则表达式引擎,但这应该是正确的......如果你使用贪婪的量词,你甚至不需要检查单词边界)