Converte uma string em rubi de expressão regular

118

Eu preciso converter string como "/ [\ w \ s] + /" para expressão regular.

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

Tentei usar Regexpmétodos diferentes , como:

Regexp.new("/[\w\s]+/") => /\/[w ]+\//, da mesma forma Regexp.compilee Regexp.escape. Mas nenhum deles retorna como eu esperava.

Além disso, tentei remover as barras invertidas:

Regexp.new("[\w\s]+") => /[w ]+/ Mas não deu sorte.

Então tentei fazer de forma simples:

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

Ele escapa. Agora, como a string poderia permanecer como está e ser convertida em um objeto regexp?

cmthakur
fonte

Respostas:

149

Parece que aqui você precisa que a string inicial esteja entre aspas simples (consulte esta página )

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

Para ser claro

  /#{Regexp.quote(your_string_variable)}/

está funcionando também

editar: embrulhado your_string_variable em Regexp.quote, para correção.

Sergey Gerasimov
fonte
3
Acabei de descobrir que você não pode anexar opções dessa forma, como /#{your_regex}/#{options}.
pduersteler
Suponho que você esteja falando sobre Rails? optionsé um Hash, e Ruby não é tããão dinâmico =)
Sergey Gerasimov
2
Isso não faz o que o OP está pedindo no Ruby 2.1, ele converte "[\ w \ s] +" => / [w] + /
Luca Spiller
1
Observe que a resposta foi dada no ano de 2012 :) Naquela época tudo estava perfeito
Sergey Gerasimov
4
Foi um ano perfeito.
Naftuli Kay
35

Este método escapará com segurança todos os caracteres com significado especial:

/#{Regexp.quote(your_string)}/

Por exemplo, .terá escape, já que é interpretado como 'qualquer caractere'.

Lembre-se de usar uma string entre aspas simples, a menos que você queira que a interpolação de string regular seja iniciada, onde a barra invertida tem um significado especial.

Sandstrom
fonte
2
Legal porque explica como podemos proteger a variável string que pode conter sinais (como +.) que seriam interpretados no Regexp.
rchampourlier
1
Isso não faz o que o OP está pedindo no Ruby 2.1, ele converte "[\ w \ s] +" => / [w \] \ + /
Luca Spiller
@LucaSpiller você precisa usar uma string entre aspas simples, a barra invertida é tratada como um caractere especial em strings entre aspas duplas, que é o motivo pelo qual, por exemplo, "\n"é uma nova linha, mas '\n'não é.
sandstrom
8

Usando a notação%:

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

ou

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

Da ajuda :

% r [] Regexp interpolado (sinalizadores podem aparecer após o delimitador de fechamento)

BitOfUniverse
fonte
Isso não faz o que o OP está pedindo no Ruby 2.1, ele converte "[\ w \ s] +" => / [ws] + /
Luca Spiller
1
@Luca Spiller, obrigado, aspas simples devem ser usadas aqui, atualizarei a resposta.
BitOfUniverse
5

A gema to_regexp pode fazer o trabalho.

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

Você também pode usar o modificador:

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

Finalmente, você pode ser mais preguiçoso usando: 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/}
Ryan
fonte