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.

img-printscreen

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.


Share → Twitter Facebook Linkedin


Hello there, my name is Jônatas Davi Paganini and this is my personal blog.
I'm developer advocate at Timescale and I also have a few open source projects on github.

Check my talks or connect with me via linkedin / twitter / github / instagram / facebook / strava / meetup.