Мне нужно преобразовать строку как "/[\ 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 ]+"
Это ускользает. Теперь, как строка останется такой, как есть, и преобразуется в объект регулярного выражения?
Похоже, здесь вам нужно, чтобы начальная строка была в одинарных кавычках (см. эта страница)
>> str = '[\w\s]+'
=> "[\\w\\s]+"
>> Regexp.new str
=> /[\w\s]+/
Чтобы быть ясным
/#{Regexp.quote(your_string_variable)}/
тоже работает
изменить: завершена your_string_variable в Regexp.quote, для правильности.
Этот метод безопасно удалит все символы со специальным значением:
/#{Regexp.quote(your_string)}/
Например, .
будет экранировано, поскольку оно иначе интерпретируется как "любой символ".
Не забудьте использовать строку с одним кавычком, если вы не хотите, чтобы регулярная интерполяция строк была нажата, где обратная косая черта имеет особое значение.
+.
), Которые будут интерпретироваться в регулярном выражении.
Использование% нотации:
%r{\w+}m => /\w+/m
или
regex_string = '\W+'
%r[#{regex_string}]
Из help:
% r [] Interpolated Regexp (флаги могут появляться после закрытия Разделитель)
Значок 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/}
/#{your_regex}/#{options}
.options
это хэш, а Ruby не тааак динамический =)