Inspecionando expressões regulares com Sinatra
Expressões regulares, muitas vezes são difíceis de compreender e também de testar. Uma boa alternativa, é inspecionar os resultados enquanto estiver construindo a expressão.
Ispirado no regexp syntax highligth feito para usar no terminal, resolvi criar uma aplicação em Sinatra que fizesse a mesma coisa.
O “segredo” básico deste aplicativo, está na forma como a expressão casa com a string. Supomos o mesmo exemplo da imagem acima, mas ao invés de trocar a cor de fundo, colocassemos os resultados casados entre parenteses. Então, seria o seguinte código.
"jonatas".gsub(/[a]+/,"(\\&)")
O resultado da substituição anterior, resulta na seguinte string:
"jon(a)t(a)s"
Desta forma, o que é importante aprender com esta expressão regular, é que neste código, quando usando o gsub, cada expressão regular que casar com algum elemento, é possível capturar o valor do elemento através da expressão:
"\\&"
Sendo este, o código acima, o próprio caracter encontrado na expressão pesquisada. Para implementar a mesma situação na web, o que resta fazer agora, é trocar a string que casou, adicionando uma propriedade que troque as cores padrões.
A abordagem será criar uma tag span com a propriedade class nomeada match. Esta classe irá trocar a cor da fonte e do fundo para tornar ao contrário os elementos que casaram com a string. Para usar a expressão no novo formato, apenas substitui usando a tag span.
A regra span com o class match tem as seguintes propriedades:
span.match { color: white; background: black; }
A expressão regular pode ser substituída por esta, que coloca a tag span:
"jonatas".gsub(/[a]+/,"<span class='match'>\\&</span>")
Testando a expressão acima, esta deve retornar a seguinte expressão:
"jon<span class='match'>a</span>t<span..."
Colocando “tudo isso” em um servidor sinatra temos:
require 'rubygems' require 'sinatra' get "/" do erb :index end post "/match" do regex = Regexp.new(params[:pattern]) replace = "<span class='match'>\\&</span>" @match = params[:string].gsub(regex,replace) erb :index end
E na view views/index.erb temos:
<html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <style type="text/css" media="screen"> span.match { color: white; background: black; } </style> <title>Teste sua expressão regular</title> </head> <body> <form action="match" method="post"> String: <input type="text" name="string" value="jonatas" /><br> Casa com: <input type="text" name="pattern" value="[a]+"/> <p><input type="submit" value="Testar" /></p> </form> <%= @match %> </body> </html>
E acabou! é só isso, extremamente simples e funcional!
ps: Visite também http://rubular.com para usufruir desta mesma funcionalidade.