В чем разница между использованием нового RegExp и использованием прямой косой черты для создания регулярного выражения?

Есть ли разница между использованием 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

Мне интересно, есть ли здесь какая-то разница или я что-то упустил в этом конкретном примере?
Пример исполняемого файла см. здесь


person didxga    schedule 27.05.2011    source источник


Ответы (4)


Если вы используете конструктор для создания нового объекта RegExp вместо буквального синтаксиса, вам нужно правильно экранировать \‍:

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 любая неизвестная управляющая последовательность \x интерпретируется как x. Так что в этом случае \. интерпретируется как ..

person Gumbo    schedule 27.05.2011
comment
В обозначении косой черты ` \ ` и ` / ` из определения класса char также должны быть экранированы. - person Phillip Kovalev; 27.05.2011
comment
@Philipp: Да для /, но нет для обратной косой черты. - person Tim Pietzcker; 27.05.2011

/.../ называется литералом регулярного выражения. new RegExp использует функцию конструктора RegExp и создает объект регулярного выражения.

На страницах разработчиков Mozilla

Литералы регулярных выражений обеспечивают компиляцию регулярного выражения при оценке скрипта. Когда регулярное выражение останется постоянным, используйте его для повышения производительности.

Использование функции конструктора обеспечивает компиляцию регулярного выражения во время выполнения. Используйте функцию конструктора, когда вы знаете, что шаблон регулярного выражения будет меняться, или если вы не знаете шаблон и получаете его из другого источника, например, из пользовательского ввода.

person KooiInc    schedule 27.05.2011

это поможет вам http://www.regular-expressions.info/javascript.html см. раздел «Как использовать объект JavaScript RegExp»

если вы используете RegExp (regx), regx должен быть в строковом формате ex:- \w+ может быть создан как regx = /\w+/ или как regx = new RegExp("\\w+").

person Jayantha Lal Sirisena    schedule 27.05.2011

Разница в побеге, по крайней мере, в вашем случае. Когда вы используете нотацию //, вы должны экранировать '/' с помощью '\/', когда вы используете нотацию Regexp, вы экранируете кавычки

person petho    schedule 27.05.2011
comment
` / ` вне определения класса char также должен быть экранирован - person Phillip Kovalev; 27.05.2011