NodeJS正则表达式模式与预期案例不匹配

时间:2017-12-10 22:42:11

标签: node.js regex web-scraping

我正在开发一个预期会找到电子邮件地址的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);

但是,如果不首先创建对象,我无法使其正常运行。

1 个答案:

答案 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