Converter curingas SQL `LIKE` em Ruby RegExp

Ei pessoal,

Tive um caso estranho em que uma pesquisa SQL teve que ser concluída com uma matriz de dados já presente na memória.

Os dados eram (no banco de dados e na memória) armazenados em chave / valor, então foi muito fácil até que me pediram para lidar com curingas de SQL …

Eventualmente, não foi tão complicado:

configs = {}
Model.where("key like #{key}").each do |c|
configs
[c.key] = c.value
end

pattern
= Regexp.escape key
pattern
= pattern.sub "%", ".*"
pattern
= pattern.sub "\?", "."
pattern
= "^#{pattern}$"
r
= Regexp.new pattern

opts
= whateverYourDataComeFrom
opts
.each do |k, v|
if r.match k
configs
[k] = v
end
end

Algumas coisas a serem observadas:

  • Regexp.escape é muito útil para evitar que caracteres especiais sejam interpretados como instruções regexp
  • %torna-se .*, literalmente, “qualquer caractere em qualquer quantidade”
  • ?torna-se ., literalmente, “qualquer personagem, apenas uma vez”. Tenha cuidado, ?tem um significado em regexp e é escapado como\?
  • ^...$ para “início da string” e “finalização da string”

Aqui está, divirta-se!