Различия между литералом и конструктором regexp Javascript - программирование
Подтвердить что ты не робот

Различия между литералом и конструктором regexp Javascript

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

var parts = new RegExp("/rt:([^@]+)@(\d+)/").exec(tag);

по сравнению с оригиналом

var parts = /rt:([^@]+)@(\d+)/.exec(tag);

Когда tag, например rt:[email protected], первый (багги) вызов возвращает null, а второй возвращает ["rt:[email protected]", "60C1C036-42FA-4073-B10B-1969BD2358FB", "00000000077"]

Излишне говорить, что я вернул изменения, но я хотел бы знать, почему в этом есть такая разница.

4b9b3361

Ответ 1

Есть две проблемы:

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

Во-вторых, обратная косая черта является символом escape в строковых литералах. Чтобы создать литерал \ для выражения, вам нужно избежать его в строке.

Таким образом, эквивалент будет:

new RegExp("rt:([^@]+)@(\\d+)")

В частности, экранирование делает выражение более сложным для записи, если вы хотите использовать RegExp. Это действительно необходимо, только если вы хотите динамически создавать выражение, то есть, если вы хотите, например, включить текст, хранящийся в переменной. Если у вас есть фиксированное выражение, литерал /.../ легче писать и более кратким.

Ответ 2

\d должен быть экранирован при передаче в конструктор new RegExp. Таким образом, это должно быть

var parts = new RegExp("rt:([^@]+)@(\\d+)").exec(tag);