Превращение регулярного выражения, возвращаемого в виде строки из API, в допустимый объект RegEx в JavaScript - PullRequest
1 голос
/ 22 марта 2019

Я извлекаю регулярное выражение из внешнего API, и оно возвращается в виде строки.Я хочу использовать регулярное выражение для проверки адреса, но, похоже, не могу должным образом экранировать нежелательные символы после вызова new RegExp() в строке.

Вот регулярное выражение, которое я хочу использовать:

console.log(regexFromAPI);

Вывод

/((\W|^)box\s+(#\s*)?\d+|post\s+office|(\W|^)p\.?\s*o\.?\s+(#\s*)?\d+)/i

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

Если я это сделаю, например:

const pattern = new RegExp(regexFromAPI);

, а затем:

console.log(pattern);

Я получуследующее:

Вывод

//((W|^)boxs+(#s*)?d+|posts+office|(W|^)p.?s*o.?s+(#s*)?d+)/i/

Мой вопрос ... почему это происходит, и как я могу избежать этого?Я хочу использовать мой строковый литерал в качестве регулярного выражения.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Снимите косые черты и флажки, а затем восстановите его:

const str = String.raw`/((\W|^)box\s+(#\s*)?\d+|post\s+office|(\W|^)p\.?\s*o\.?\s+(#\s*)?\d+)/i`;
let regexBody = str.slice(1, str.lastIndexOf("/"));
let flags = str.split("/")[str.split("/").length - 1];
let regex = new RegExp(regexBody, flags);
console.log(regex);
2 голосов
/ 22 марта 2019

Конструктор RegExp не ожидает ни строки с разделителями /, ни параметров после последнего /.Если вы сделаете это, шаблон, сгенерированный при вызове new RegExp с ним, приведет к тому, что шаблон будет соответствовать строке, которая начинается с буквальной косой черты / и заканчивается косой чертой /, за которой следуют символы флага (здесь, i).

Вместо этого вы должны передать строку шаблона без / разделителей и передать флаги в качестве второго аргумента - вы можете легко извлечь их, используя другое регулярное выражение:

const fullPatternStr = String.raw`/((\W|^)box\s+(#\s*)?\d+|post\s+office|(\W|^)p\.?\s*o\.?\s+(#\s*)?\d+)/i`;

const [, pattern, flags] = fullPatternStr.match(/\/(.*)\/([a-z]*)/);
const regex = new RegExp(pattern, flags);
console.log(regex);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...