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

Вопрос

Объявлен 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));

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *