Преобразование RegExp в String, а затем обратно в RegExp

Итак, у меня есть RegExp regex = /asd/

Я храню его как ключ в моей системе хранения ключей.

Итак, я говорю str = String(regex), который возвращает "/asd/".

Теперь мне нужно преобразовать эту строку обратно в RegExp.

Итак, я пытаюсь: RegExp(str), и я вижу /\/asd\//

Это не то, что я хочу. Это не то же самое, что /asd/

Должен ли я просто удалить первый и последний символы из строки перед преобразованием его в регулярное выражение? Это даст мне желаемый результат в этой ситуации, но не обязательно будет работать, если у RegExp были такие модификаторы, как /i или /g

Есть ли лучший способ сделать это?

Ответ 1

Если вам не нужно сохранять модификаторы, вы можете использовать Regexp#source, чтобы получить строковое значение, а затем конвертировать обратно, используя конструктор RegExp.

var regex = /abc/g;
var str = regex.source; // "abc"
var restoreRegex = new RegExp(str, "g");

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

var regex = /abc/g;
var str = regex.toString(); // "/abc/g"
var parts = /\/(.*)\/(.*)/.exec(str);
var restoredRegex = new RegExp(parts[1], parts[2]);

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

Если производительность является проблемой, используйте обычную манипуляцию с использованием строки String#lastIndexOf:

var regex = /abc/g;
var str = regex.toString(); // "/abc/g"
var lastSlash = str.lastIndexOf("/");
var restoredRegex = new RegExp(str.slice(1, lastSlash), str.slice(lastSlash + 1));

Ответ 3

regex = /asd/;
str = regex.source;

str будет "asd", избегая проблем с косой чертой.