Преобразование 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));
Ответ 2
Вы можете использовать следующее перед сохранением своего литерала регулярного выражения:
(new RegExp(regex)).source
См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/source
Пример:
regex = /asd/
string = (new RegExp(regex)).source
// string is now "asd"
regex = RegExp(string)
// regex has the original value /asd/
Ответ 3
regex = /asd/;
str = regex.source;
str
будет "asd", избегая проблем с косой чертой.