В чем разница между использованием "new RegExp" и использованием косой черты для создания регулярного выражения? - PullRequest
15 голосов
/ 27 мая 2011

Есть ли разница между использованием new RegExp("regex"); и /same_regex/ для проверки целевой строки? Я задаю этот вопрос, потому что я получил разные результаты проверки при использовании этих двух подходов. Вот фрагмент кода, который я использовал для проверки поля электронной почты:


var email="didxga@gmail.comblah@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

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

Ответы [ 4 ]

13 голосов
/ 27 мая 2011

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

11 голосов
/ 27 мая 2011

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

Со Страницы разработчика Mozilla

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

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

3 голосов
/ 27 мая 2011

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

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

2 голосов
/ 27 мая 2011

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

...