Ruby удаляет интерполяцию из строки - PullRequest
0 голосов
/ 20 ноября 2018

Я хочу удалить интерполяцию строк для eval.

У меня много мест с таким кодом, поэтому только одна опция изменяет условие на код неэкранирования.

Я нашел регулярное выражениеэто хорошо работает

"\#{user.name}"[/[^\#{}]+/]

в результате у меня есть "user.name"

, но такой код, удаляющий фигурные скобки в блоках, также

"\#{[1,2,3].map { |el| el }.join(',')}"[/[^\#{}]+/]

возвращает

"[1,2,3].map "

Ожидаемый результат:

"[1,2,3].map { |el| el }.join(',')"

Есть идеи, как его решить?

1 Ответ

0 голосов
/ 20 ноября 2018

В этом случае вы можете использовать gsub и именованное регулярное выражение

> reg = Regexp.new('\\#{(?<content>.+)}')
=> /\#{(?<content>.+)}/
> str1.gsub(reg) { |match| $~[:content] }
=> "user.name"
> str2.gsub(reg) { |match| $~[:content] }
=> "[1,2,3].map { |el| el }.join(',')"

Ваш пример не сработал, поскольку [^smth] соответствует любому отдельному символу в списке, а не всему предложению.

Кстати, я хотел бы предупредить вас, что регулярное выражение может подойти для простых настроек, но оно всегда будет иметь некоторые крайние случаи.Я не уверен, как приведенный выше пример будет вести себя при интерполяции внутри интерполяции, например.

Лучше использовать правильный лексер и парсер для более сложных случаев.

Кроме того, будьте очень ... очень осторожно eval

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...