2016-08-25 3 views
10

Так что у меня РегВыр regex = /asd/преобразования RegExp в строку затем обратно в RegExp

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

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

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

Так что я стараюсь: RegExp(str) и я вижу /\/asd\//

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

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

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

+5

Есть ли (новое RegExp (regex)). Source() 'помощь перед хранением? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/source – jedifans

+0

@jedifans Я вижу, что вы говорите, да, это должно сработать. Таким образом, я не сохраняю косые черты в строке –

+0

. Я преобразую ее в ответ :) – jedifans

ответ

14

Если вам не нужно хранить модификаторы, вы может использовать 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

Я полагаю, что также стоит упомянуть, что вы можете просто сделать var varRegex = eval (str) ;, но это будет медленнее и будет иметь возможность выполнять произвольный JavaScript. – 4castle

+0

Как насчет 'regex.toString(). Split ('/')' – Xotic750

+1

@ Xotic750 Это не удастся, если '/' находится в самом шаблоне регулярного выражения – 4castle

1

Вы можете использовать следующие перед хранением Вашего регулярное выражение буквального:

(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/ 
+0

И если это 'regex =/asd/ig'? Кроме того, это должен быть 'source', а не' source() '. –

+0

Почему вы вызываете 'новый RegExp'? Это уже регулярное выражение. Разве вы не просто 'string = regex.source'? – 4castle

+0

True @ WiktorStribiżew, источник не учитывает этого, хотя я полагаю, что '.flags' также может быть сохранен. @ 4castle, я не был уверен, что литерал регулярного выражения на самом деле является экземпляром RegExp. – jedifans

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

str будет "ASD", избегая каких-либо проблем слэш.

Смежные вопросы