В чем разница между использованием RegExp и использованием нотации прямой косой черты для тестирования со String?
Есть ли разница между использованием new RegExp("regex");
и /same_regex/
для проверки на целевую строку? Я задаю этот вопрос, потому что у меня есть другой результат проверки, используя эти два подхода. Вот фрагмент, который я использовал для проверки поля электронной почты:
var email="[email protected]@foo.com";
var regex1 = new RegExp("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$");
var regex2 = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
//using RegExp object
if(regex1.test(email)) {
console.log("email matched regex1");
} else {
console.log("email mismatched regex1");
}
//using slash notation
if(regex2.test(email)) {
console.log("email matched regex2");
} else {
console.log("email mismatched regex2");
}
Я получил два непоследовательных результата:
email matched regex1
email mismatched regex2
Мне интересно, есть ли какая-либо разница здесь или я пропустил что-то в этом конкретном примере?
Для исполняемого примера см. здесь
Ответы
Ответ 1
Если вы используете конструктор для создания нового объекта RegExp вместо синтаксиса literal, вам нужно правильно выполнить \
:
new RegExp("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$")
Это необходимо, как и в JavaScript, любая неизвестная escape-последовательность \x
интерпретируется как x
. Поэтому в этом случае \.
интерпретируется как .
.
Ответ 2
/.../
называется литералом регулярного выражения. new RegExp
использует конструктор RegExp и создает объект регулярного выражения.
Из страниц разработчиков Mozilla
Регулярные выражения компиляция регулярного выражения когда оценивается script. Когда регулярное выражение останется постоянный, используйте это для улучшения производительность.
Использование функции конструктора обеспечивает компиляцию времени выполнения регулярное выражение. Использовать конструктор, когда вы знаете шаблон регулярного выражения будет изменения, или вы не знаете шаблон и получают его от другой источник, например пользовательский ввод.
Ответ 3
это поможет вам
http://www.regular-expressions.info/javascript.html
см. раздел "Как использовать объект JavaScript RegExp"
Если вы используете RegExp (regx), regx должен быть в формате строки ex: -
\ w + может быть создан как regx = /\w+/
или как regx = new RegExp("\\w+")
.
Ответ 4
Разница заключается в том, чтобы убежать, по крайней мере, в вашем случае.
Когда вы используете//нотацию, вам нужно избегать "/" с помощью "\/", когда вы используете обозначение Regexp, вы избегаете кавычек