2016-04-28 2 views
5

Я учусь о RegExp, но везде я вижу два синтаксисJavaScript: RegExp Конструктор против RegEx буквального

new RegExp("[abc]") 

И

/[abc]/ 

И если с модификаторами то, что использование дополнительного слэша (\)

/\[abc]/g 

Я не получаю ошибку с этими двумя, но я wond Есть ли разница между этими двумя. Если да, то что это такое и что лучше всего использовать?

Я указал Differences between Javascript regexp literal and constructor, но там я не нашел объяснения, которое является лучшим и что такое разница.

+1

Заметит, что '/ \ [а]/G' будет соответствовать' [а] ', потому что первая скобка убежала. Это полностью отличается от 'new RegExp (" [abc] ")' и '/ [abc] /'. – Tushar

+0

Да, я знаю '/ \ [abc]/g' i упомянул об этом, чтобы знать, почему нам нужно использовать дополнительные' \ ', если мы используем модификаторы. –

+1

Нет, нет необходимости. Вы можете добавить модификаторы после последнего '/', например. '/ [abc]/gi' – Tushar

ответ

9

Главное отличие состоит в том, что литерал REGEX не может принимать динамический ввод, т. Е. От переменных, тогда как конструктор может, поскольку шаблон указан как строка.

Допустим, вы хотели, чтобы соответствовать одно или несколько слов из массива в строку:

var words = ['foo', 'bar', 'orange', 'platypus']; 
var str = "Foo something nice orange what a lovely platypus"; 
str.match(new RegExp('\\b('+words.join('|')+')\\b')); 

Это не было бы возможно с буквальным /pattern/, как что-нибудь между два слеша интерпретируется буквально.

Обратите внимание, что при указании паттернов таким образом необходимо избегать специальных символов (т. Е. \\), потому что мы делаем это в строке - первая обратная косая черта должна быть экранирована второй, поэтому одна из них делает это в шаблон. Если бы их было только одно, это было бы интерпретировано синтаксическим анализатором JS как escape-символом и удаляться.

+1

Но обратите внимание, что буквальный синтаксис выполняется только один раз с помощью JS-кода, а форма 'new Regexp()' должна компилировать регулярное выражение каждый раз, когда он вызывается, - поэтому производительность будет лучше с литеральной версией: используйте ее как только возможно! – Doin

+0

Несомненно, но здесь литерал невозможен, так как он не является динамическим (по крайней мере, без использования 'eval()'.) – Utkanos

6
  1. Как вы можете видеть, синтаксис конструктора RegExp требует передачи строки. \ в строке используется для выхода из следующего символа. Таким образом,

    new RegExp("\s") // This gives the regex `/s/` since s is escaped. 
    

    будет производить регулярное выражение s.

    Примечание: добавить модификаторы/флаги, передать флаги в качестве второго параметра функции-конструктора.

    Пока, /\s/ - буквенный синтаксис, создаст регулярное выражение, которое предсказуемо.

  2. Синтаксис конструктора RegExp позволяет динамически создавать регулярные выражения.

Так что, когда нужно быть сделан динамически регулярное выражение, используйте RegExp синтаксис конструктора в противном случае использовать регулярное выражение буквального синтаксиса.

+0

почему ваш ответ отмечен как wiki сообщества? –

+1

@KhalidHussain Я думаю, что это можно сделать более каноническим, другие могут также отредактировать его, чтобы сделать его более полезным. – Tushar

0

Существует два способа определения регулярных выражений.

  1. через объект конструктора
    • Может быть изменен во время выполнения.
  2. Через буквальный.
    • Составитель при загрузке сценария
    • Повышение производительности

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

Вы можете использовать любого из двух, и они будут обработаны точно таким же образом ..

+2

«Через буквальный» раздел неверен - это просто мифы, которые, к сожалению, чрезвычайно популярны. Двигатели JS не делают различий в уровне выполнения между ними. Независимо от того, как создание RegExp было написано в коде (будь то с помощью синтаксиса сахара или глобального конструктора), испущенный код является одним и тем же, и регулярное выражение с лёгкостью компилируется при первом использовании. – RReverser

+0

@RReverser - MDN говорит иначе, хотя я согласен с тем, что документы, возможно, не были написаны кодерами. https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions – mwardm

Смежные вопросы