Проблема с захватом всех электронных писем из строки DOM с совпадением и регулярным выражением

#javascript #vue.js

#javascript #vue.js

Вопрос:

Я пытаюсь извлечь все электронные письма из html-строки DOM, используя совпадение регулярных выражений и javascript, но я получаю null, это из-за моего регулярного выражения или строки, которую я использую для его тестирования?

 var bodyHTML = '<header><div><a href="mailto:mymail@gmail.com"></a></div></header><a href="mailto:othermail@hotmail.com"></a>';

        var emailRegex = new RegExp("/([s]*)([_a-zA-Z0-9-] (.[_a-zA-Z0-9-] )*([ ] |)@([ ] |)([a-zA-Z0-9-] .) ([a-zA-Z]{2,}))([s]*)/i", "g");
        var results = bodyHTML.match(emailRegex); 
        console.log(results);
  

Заранее спасибо!

Ответ №1:

Поскольку вы используете RegExp конструктор, а не литерал регулярного выражения, косые черты и i в конце интерпретируются как совпадающие символы, а обратные косые черты «съедаются» экранированием строки JavaScript. Вот упрощенный пример:

 const regexFromConstructor = new RegExp("/as /i")
// evaluates to //s //i (matches 1 forward slash, 1 "a", 1  "s"es, another forward slash, and finally 1 "i")

const regexFromLiteral = /as /i
// matches 1 "a" followed by 1 or more whitespace characters, case insensitive
  

Вы можете решить эту проблему, используя вместо этого литерал регулярного выражения (разделенный косыми чертами):

 const emailRegex = /([s]*)([_a-zA-Z0-9-] (.[_a-zA-Z0-9-] )*([ ] |)@([ ] |)([a-zA-Z0-9-] .) ([a-zA-Z]{2,}))([s]*)/gi;
  

Ответ №2:

Ваше регулярное выражение в порядке, вам просто нужно создать регулярное выражение как литерал регулярного выражения, то есть без кавычек вокруг него " :

 var bodyHTML = '<header><div><a href="mailto:mymail@gmail.com"></a></div></header><a href="mailto:othermail@hotmail.com"></a>';

var emailRegex = new RegExp(/([s]*)([_a-zA-Z0-9-] (.[_a-zA-Z0-9-] )*([ ] |)@([ ] |)([a-zA-Z0-9-] .) ([a-zA-Z]{2,}))([s]*)/i, "g");
var results = bodyHTML.match(emailRegex);

console.log(results);