#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);