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

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

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

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

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

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

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

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

str = "[\w\s]+"
=> "[w ]+"

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

Ответ 1

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

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

Ответ 2

Чтобы быть ясным

  /#{Regexp.quote(your_string_variable)}/

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

изменить: завершена your_string_variable в Regexp.quote, для правильности.

Ответ 3

Этот метод безопасно удалит все символы со специальным значением:

/#{Regexp.quote(your_string)}/

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

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

Ответ 4

Использование% нотации:

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

или

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

Из help:

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

Ответ 5

Значок 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/}