Как вы храните регулярное выражение Ruby через контроллер Rails? - PullRequest
2 голосов
/ 24 февраля 2011

Для функции администратора в приложении Rails я хочу иметь возможность хранить регулярные выражения в БД (в виде строк) и добавлять их с помощью стандартного действия контроллера.

Я столкнулся с 2 проблемами:

1) Фильтры параметров Rails, кажется, автоматически экранируют обратную косую черту (escape-символы), что портит регулярное выражение. Например:

\s{1,2}(foo)

становится:

\\s{1,2}(foo)

2) Тогда я попытался использовать write_attribute для gsub экземпляров двойных обратных косых черт с одиночными обратными косыми чертами (по сути, с их удалением). Это оказалось намного сложнее, чем ожидалось. (Я использую Ruby 1.9.2, если это имеет значение). Некоторые вещи, которые я нашел:

"hello\\world".gsub(/\\/, ' ') #=> "hello world"
"hello\\world".gsub(/\\/, "\\") #=> "hello\\world"
"hello\\world".gsub(/\\/, '\\') #=> "hello\\world"

Я пытаюсь сделать следующее:

"hello\\world".gsub(/\\/, something) #=> "hello\world"

Я бы хотел знать оба решения.

1) Как вы можете безопасно передавать и хранить регулярные выражения в качестве параметров для действия контроллера Rails?

2) Как заменить двойную обратную косую черту одной обратной?

1 Ответ

3 голосов
/ 24 февраля 2011

Короче говоря, вы не можете заменить двойную обратную косую черту на одну в строке, потому что одна обратная косая черта в строке является escape-символом. Что вы можете сделать, это следующее:

Regexp.new("hello\\world") #=> /hello\world/

Это преобразует вашу строку в регулярное выражение. Это означает: сохраните ваши регулярные выражения в виде строк (с экранированными символами) и преобразуйте их в регулярные выражения, когда вы хотите сравнить с ними:

regexp = "\\s{1,2}(foo)"
reg = Regexp.new(regexp) #=> /\s{1,2}(foo)/
" foo" =~ reg #=> 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...