我正在开发一个预期会找到电子邮件地址的nodeJS服务器,并且必须使用正则表达式来执行此操作。
我使用以下模式:
/[A-Z0-9.]+@[A-Z0-9.-]+\.[A-Z]{2,}([A-Z]{2,})?/i
我希望它与示例电子邮件相匹配。这是一个来自被删除网站的真实片段,只是匿名的。
<a href="mailto:user@a.foo.edu">user@a.foo.edu</a>
为此,我正在使用内置String.match()函数,如下所示:
let expr = /[A-Z0-9.]+@[A-Z0-9.-]+\.[A-Z]{2,}([A-Z]{2,})?/i
let str = "<a href="mailto:user@a.foo.edu">user@a.foo.edu</a>"
console.log(str.match(expr));
我希望输出是一个匹配数组,而是得到null
。请注意,在服务器中,str
是使用Cheerio抓取并使用toString()
转换的网页的完整HTML。我创建了它in this Regexr example。
任何想法都表示赞赏。
解决方案
我不确定为什么我的原始方法不起作用。最后,创建一个RegExp对象对我有用:
let expression = "[A-Z0-9.]+@[A-Z0-9.-]+\.[A-Z]{2,}([A-Z]{2,})?"
let regexp = new RegExp(expression, 'ig');
let results = bodyText.match(regexp);
但是,如果不首先创建对象,我无法使其正常运行。
答案 0 :(得分:0)
将g
添加到正则表达式的结尾
let expr = /[A-Z0-9.]+@[A-Z0-9.-]+\.[A-Z]{2,}([A-Z]{2,})?/ig
let str = "<a href="mailto:user@a.foo.edu">user@a.foo.edu</a>"
console.log(str.match(expr));
RegExp标志
g
全球比赛;找到所有比赛而不是在第一场比赛后停止i
忽略案件
m
多;将起始和结束字符(^和$)视为多行(即匹配每行的开头或结尾) line(由\ n或\ r分隔),不仅是开头或结尾 整个输入字符串)
u
统一;将模式视为一系列unicode代码点y
黏;仅匹配目标字符串中此正则表达式的lastIndex属性指示的索引(并且不匹配) 尝试从任何后续索引匹配)。
看看MDN