Преобразовать строку в регулярное выражение ruby - PullRequest
109 голосов
/ 28 декабря 2011

Мне нужно преобразовать строку типа "/ [\ 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 ]+"

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

Ответы [ 5 ]

137 голосов
/ 28 декабря 2011

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

>> str = '[\w\s]+'
 => "[\\w\\s]+" 
>> Regexp.new str
 => /[\w\s]+/ 
127 голосов
/ 25 июля 2012

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

  /#{Regexp.quote(your_string_variable)}/

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

edit: обернул your_string_variable в Regexp.quote, для корректности.

34 голосов
/ 07 марта 2014

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

/#{Regexp.quote(your_string)}/

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

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

7 голосов
/ 15 декабря 2014

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

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

или

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

Из help :

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

4 голосов
/ 17 сентября 2015

Драгоценный камень to_regexp может сделать работу.

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

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

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

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

'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/}
...