29Jun

Como usar expressões básicas regulares para procurar melhores e economizar tempo

Se você já pesquisou com o Grep ou viu programas que podem mudar o nome dos arquivos para você, você provavelmente se perguntou se havia uma maneira mais fácil de fazer seu trabalho. Felizmente, existe, e é chamado de "expressões regulares".

( Comic from XKCD.com)

O que são expressões regulares?

Expressões regulares são declarações formatadas de forma muito específica e que podem representar muitos resultados diferentes. Também conhecido como "regex" ou "regexp", eles são usados ​​principalmente nas funções de nomeação de pesquisa e arquivo. Um regex pode ser usado como uma fórmula para criar uma série de diferentes saídas possíveis, todas as quais são pesquisadas. Alternativamente, você pode especificar como um grupo de arquivos deve ser nomeado especificando um regex, e seu software pode mover-se de forma incremental para a próxima saída pretendida. Desta forma, você pode renomear vários arquivos em várias pastas de forma muito fácil e eficiente, e você pode ir além das limitações de um sistema de numeração simples.

Como o uso de expressões regulares depende de uma sintaxe especial, seu programa deve ser capaz de lê-las e analisá-las. Muitos programas de renomeação de arquivos em lote para o Windows e OS X têm suporte para regexps, bem como a ferramenta de busca multiplataforma GREP( que tocamos no nosso Guia Bash Scripting for Beginners Guide) e a ferramenta de linha de comando Awk para * Nix. Além disso, muitos gerentes de arquivos, lançadores e ferramentas de pesquisa alternativos os usam, e eles têm um lugar muito importante em linguagens de programação como Perl e Ruby. Outros ambientes de desenvolvimento como o. NET, Java e Python, bem como o próximo C ++ 11, fornecem bibliotecas padrão para usar expressões regulares. Como você pode imaginar, eles podem ser realmente úteis ao tentar minimizar a quantidade de código que você coloca em um programa.

Uma nota sobre caracteres de escape

Antes de mostrarmos exemplos, gostaríamos de apontar algo. Vamos usar o shell bash e o comando grep para mostrar como aplicar expressões regulares. O problema é que às vezes queremos usar caracteres especiais que precisam ser passados ​​para o grep, e o shell bash interpretará esse personagem porque o shell também o usa. Nessas circunstâncias, precisamos "escapar" desses personagens. Isso pode ficar confuso porque esta "escapar" de personagens também ocorre dentro de regexps. Por exemplo, se quisermos inserir isso no grep:

\ & lt;

teremos que substituir isso por:

\\\ & lt;

Cada personagem especial aqui obtém uma barra invertida. Alternativamente, você também pode usar aspas simples:

'\ & lt;'

As citações simples indicam bash NOT para interpretar o que está dentro delas. Embora exijamos que essas etapas sejam tomadas para que possamos demonstrar para você, seus programas( principalmente, com base em GUI) geralmente não exigem essas etapas extras. Para manter as coisas simples e diretas, a expressão regular real será dada a você como texto citado e você verá a sintaxe escapada nas capturas de tela da linha de comando.

Como expandem?

Regexps são uma maneira realmente concisa de indicar termos para que o seu computador possa expandi-los para várias opções. Vamos dar uma olhada no seguinte exemplo:

tom [0123456789]

Os colchetes - [e] - diga ao mecanismo de análise que o que quer que esteja dentro, qualquer caractere ONE pode ser usado para combinar. O que quer que esteja dentro desses suportes é chamado de conjunto de caracteres.

Então, se tivéssemos uma enorme lista de entradas e usássemos esta regex para pesquisar, os seguintes termos seriam compatíveis:

  • tom
  • tom0
  • tom1
  • tom2
  • tom3

e assim por diante. No entanto, a seguinte lista NÃO seria compatível e, portanto, NÃO aparecerá em seus resultados: tomate

  • ;O regex não conta para nenhuma letra após "tom"
  • Tom;O regex é sensível a maiúsculas e minúsculas

Você também pode escolher pesquisar com um período( .) Que permitirá que qualquer personagem presente, desde que exista um personagem presente.

Como você pode ver, coagir com

. tom

não apresentou termos que só tinham "tom" no início. Mesmo os "tomates verdes" entraram, porque o espaço antes de "tom" conta como um personagem, mas termos como "tomF" não possuíam um personagem no início e foram assim ignorados.

Nota: O comportamento padrão do Grep é retornar uma linha inteira de texto quando alguma parte corresponde ao seu regex. Outros programas podem não fazer isso, e você pode desligar isso no grep com o sinalizador '-o'.

Você também pode especificar a alternância usando um pipe( |), como aqui:

speciali( s | z) e

Isto irá encontrar ambos:

  • especializar
  • especializar

Ao usar o comando grep, precisamos escapar dos caracteres especiais( ,|, e) com barras invertidas, bem como utilizar a bandeira '-E' para que isso funcione e evite erros feios.

Como mencionamos acima, isso é porque precisamos dizer ao shell bash para passar esses personagens para grep e não fazer nada com eles. A bandeira '-E' diz ao grep que use os parênteses e o pipe como caracteres especiais.

Você pode pesquisar por exclusão usando um cursor que esteja dentro de seus colchetes e no início de um conjunto:

tom [^ F | 0-9]

Novamente, se você estiver usando grep e bash, lembre-se de escaparesse cachimbo!

Os termos que estavam na lista, mas NÃO apareceram, são:

  • tom0
  • tom5
  • tom9
  • tomF

Estes não combinaram com o nosso regex.

Como posso usar ambientes?

Muitas vezes, procuramos com base em limites.Às vezes, só queremos cordas que aparecem no início de uma palavra, no final de uma palavra, ou no final de uma linha de código. Isso pode ser facilmente feito usando o que chamamos de âncoras.

Usando um cursor( fora dos suportes), você pode designar o "início" de uma linha.

^ tom

Para procurar o fim de uma linha, use o sinal de dólar.

tom $

Você pode ver que nossa cadeia de pesquisa vem ANTES da âncora neste caso.

Você também pode encontrar correspondências que aparecem no início ou no final de palavras, não em linhas inteiras.

\ & lt; tom

tom \ & gt;

Como mencionamos na nota no início deste artigo, precisamos escapar desses caracteres especiais porque estamos usando bash. Alternativamente, você também pode usar aspas simples:

Os resultados são os mesmos. Certifique-se de usar aspas simples e não as aspas duplas.

Outros recursos para Advanced Regexps

Nós só atingimos a ponta do iceberg aqui. Você também pode procurar por termos de dinheiro delineados pelo marcador de moeda e procurar por três ou mais termos correspondentes. As coisas podem ficar realmente complicadas. Se você estiver interessado em aprender mais sobre expressões regulares, então, veja as seguintes fontes.

  • Zytrax.com tem algumas páginas com exemplos específicos de por que as coisas fazem e não combinam.
  • Regular-Expressions.info também tem um guia assassino para um monte de coisas mais avançadas, bem como uma página de referência acessível.
  • Gnu.org tem uma página dedicada ao uso de regexps com grep.

Você também pode criar e testar suas expressões regulares usando uma ferramenta online baseada em Flash gratuita chamada RegExr. Funciona como você escreve, é gratuito e pode ser usado na maioria dos navegadores.

Você tem um uso favorito para expressões regulares? Saiba um renomador de batch grande que os usa? Talvez você queira se gabar de seu grep-fu. Contribua com seus comentários comentando!