Преобразование строки в регулярное выражение ruby

мне нужно преобразовать строку типа "/ [ws]+/ " в регулярное выражение.

"/[ws]+/" => /[ws]+/

Я пробовал использовать разные Regexp методы, как:

Regexp.new("/[ws]+/") => //[w ]+// аналогично Regexp.compile и Regexp.escape. Но никто из них не вернулся, как я ожидал.

далее я попытался удалить обратные косые черты:

Regexp.new("[ws]+") => /[w ]+/ но не повезло.

тогда я попытался сделать это просто:

str = "[ws]+"
=> "[w ]+"

он убегает. Теперь, как строка может оставаться такой, как есть, и преобразовываться в a объекта regexp?

5 ответов


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

>> str = '[\w\s]+'
 => "[\w\s]+" 
>> Regexp.new str
 => /[\w\s]+/ 

для ясности

  /#{Regexp.quote(your_string_variable)}/

работает тоже

edit: завернул your_string_variable в регулярное выражение.цитата, для корректности.


этот метод будет безопасно избежать всех символов с особым значением:

/#{Regexp.quote(your_string)}/

например, . будет экранирован, так как в противном случае он интерпретируется как "любой символ".

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


используя % Примечание:

%r{\w+}m => /\w+/m

или

regex_string = '\W+'
%r[#{regex_string}]

С помогите:

%r [] интерполированное регулярное выражение (флаги могут появиться после закрытия разделитель)


камень to_regexp может сделать работу.

"/[\w\s]+/".to_regexp => /[\w\s]+/

вы также можете использовать модификатор:

'/foo/i'.to_regexp => /foo/i

наконец, вы можете быть более ленивым, используя: detect

'foo'.to_regexp(detect: true)     #=> /foo/
'foo\b'.to_regexp(detect: true)   #=> %r{foo\b}
'/foo\b/'.to_regexp(detect: true) #=> %r{foo\b}
'foo\b/'.to_regexp(detect: true)  #=> %r{foo\b/}