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

94

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

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

Теги:
string
ruby-1.9.3

5 ответов

107
Лучший ответ

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

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

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

  /#{Regexp.quote(your_string_variable)}/

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

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

  • 3
    Просто обнаружил, что вы не можете добавлять параметры таким образом, как /#{your_regex}/#{options} .
  • 0
    Я полагаю, что вы говорите о Rails? options это хэш, а Ruby не тааак динамический =)
Показать ещё 4 комментария
34

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

/#{Regexp.quote(your_string)}/

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

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

  • 2
    Хорошо, потому что он объясняет, как мы можем защитить строковую переменную, которая может содержать знаки (например, +. ), Которые будут интерпретироваться в регулярном выражении.
  • 1
    Это не делает то, что OP запрашивает в Ruby 2.1, оно конвертирует "[\ w \ s] +" => / [w \] \ + /
Показать ещё 1 комментарий
3

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

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

или

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

Из help:

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

  • 0
    Это не делает то, что OP запрашивает в Ruby 2.1, оно конвертирует "[\ w \ s] +" => / [ws] + /
  • 0
    @ Luca Spiller, спасибо, там нужно использовать одинарные кавычки, я обновлю ответ.
1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню