Вопрос
Объявлен RegExp regex = /asd/
Я храню его как ключ в моей системе хранения ключей.
Допустим, я попытаюсь преобразовать str = String(regex)
тогда результатом будет "/asd/"
.
Теперь мне нужно преобразовать строку обратно в RegEx.
Я выполняю: RegExp(str)
и вижу /\/asd\//
это не то, что я хочу. Это не то же самое, что /asd/
Можно ли просто удалить первый и последний символы из строки перед преобразованием ее в регулярное выражение? Это дало бы мне желаемый результат в данной ситуации, но не обязательно сработало бы, если бы в RegExp были такие модификаторы, как /i
or /g
Есть лучший способ сделать это?
Ответ
Если вам не нужно хранить модификаторы, вы можете использовать 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]);
Это будет работать, даже если в шаблоне есть /
в нем, потому чтоe .*
жаден и будет продвигаться до последнего /
в строке.
Если производительность вызывает беспокойство, используйте обычные манипуляции со строками, используя 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));