Como usar expressões regulares básicas para pesquisar melhor e economizar tempo
Se você está pesquisando com o Grep ou olhando programas que podem renomear arquivos em lote para você, provavelmente você já se perguntou se havia uma maneira mais fácil de realizar seu trabalho. Felizmente, existe e é chamado de "expressões regulares".
(Comic de XKCD.com)
O que são expressões regulares?
Expressões regulares são instruções formatadas de uma maneira muito específica e que podem representar muitos resultados diferentes. Também conhecidos como “regex” ou “regexp”, eles são usados principalmente nas funções de pesquisa e nomeação de arquivos. Um regex pode ser usado como uma fórmula para criar um número de diferentes saídas possíveis, todas pesquisadas. Alternativamente, você pode especificar como um grupo de arquivos deve ser nomeado, especificando um regex, e seu software pode ir progressivamente para a próxima saída pretendida. Desta forma, você pode renomear múltiplos arquivos em múltiplas pastas de maneira muito fácil e eficiente, e você pode ir além das limitações de um simples sistema de numeração..
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 Windows e OS X têm suporte para regexps, bem como a ferramenta de busca entre plataformas GREP (que abordamos em nosso Guia Bash Scripting for Beginners) e a ferramenta de linha de comando Awk para * Nix. Além disso, muitos gerenciadores de arquivos, lançadores e ferramentas de pesquisa alternativas os utilizam e têm um lugar muito importante em linguagens de programação como Perl e Ruby. Outros ambientes de desenvolvimento, como .NET, Java e Python, bem como o próximo C ++ 11, fornecem bibliotecas padrão para o uso de 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 personagens que escapam
Antes de mostrarmos exemplos, gostaríamos de apontar algo. Vamos usar o bash shell 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 caractere porque o shell também o utiliza. Nestas circunstâncias, precisamos "escapar" desses personagens. Isso pode ficar confuso porque esse "escape" de caracteres também ocorre dentro de regexps. Por exemplo, se quisermos inserir isso no grep:
\<
nós vamos ter que substituir isso com:
\\\<
Cada caractere especial aqui recebe uma barra invertida. Alternativamente, você também pode usar aspas simples:
'\<'
Aspas simples dizem NÃO para interpretar o que está dentro delas. Embora exijamos que essas etapas sejam seguidas para que possamos demonstrar para você, seus programas (especialmente aqueles baseados em GUI) geralmente não exigem essas etapas adicionais. Para manter as coisas simples e diretas, a expressão regular real será fornecida a você como texto citado e você verá a sintaxe de escape nas capturas de tela de linha de comando.
Como eles expandem?
Regexps são uma forma muito concisa de estabelecer termos para que seu computador possa expandi-los em múltiplas opções. Vamos dar uma olhada no seguinte exemplo:
tom [0123456789]
Os colchetes - [e] - dizem ao mecanismo de análise que, seja lá o que estiver dentro, qualquer caractere ONE pode ser usado para combinar. O que quer que esteja dentro desses parênteses é chamado de conjunto de caracteres.
Então, se tivéssemos uma lista enorme de entradas e usamos esse regex para pesquisar, os seguintes termos seriam correspondidos:
- tom
- tom0
- tom1
- tom2
- tom3
e assim por diante. No entanto, a lista a seguir NÃO seria correspondida e, portanto, NÃO apareceria em seus resultados:
- tomate ; o regex não responde por nenhuma letra depois de “tom”
- Tom; o regex é sensível a maiúsculas e minúsculas!
Você também pode optar por pesquisar com um ponto (.) Que permitirá qualquer caractere presente, desde que haja um caractere presente.
Como você pode ver, grepping com
.tom
não trouxe termos que só tinham "tom" no começo. Até mesmo “tomates verdes” vieram, porque o espaço antes de “tom” conta como um caractere, mas termos como “tomF” não tinham um caractere no começo e foram, portanto, 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 desativar isso no grep com o sinalizador '-o'.
Você também pode especificar alternação usando um pipe (|), como aqui:
speciali (s | z) e
Isto encontrará ambos:
- especializar
- especializar
Ao usar o comando grep, precisamos escapar dos caracteres especiais (, |, e) com barras invertidas, bem como utilizar o sinalizador '-E' para que isso funcione e evitar erros feios.
Como mencionamos acima, isso ocorre porque precisamos dizer ao bash shell para passar esses caracteres para o grep e não fazer nada com eles. O sinalizador '-E' diz ao grep para usar os parênteses e o pipe como caracteres especiais.
Você pode pesquisar por exclusão usando um cursor que esteja dentro dos colchetes e no início de um conjunto:
tom [^ F | 0-9]
Novamente, se você estiver usando grep e bash, lembre-se de escapar desse pipe!
Os termos que estavam na lista, mas NÃO apareceram são:
- tom0
- tom5
- tom9
- TomF
Estes não correspondem ao nosso regex.
Como posso utilizar ambientes?
Muitas vezes, procuramos com base em limites. Às vezes, queremos apenas strings 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 feito facilmente usando o que chamamos de âncoras.
Usar um cursor (fora dos colchetes) permite designar o "início" de uma linha.
^ tom
Para procurar o final de uma linha, use o cifrão.
tom $
Você pode ver que nossa string de pesquisa vem ANTES da âncora nesse caso.
Você também pode para correspondências que aparecem no início ou no final das palavras, não linhas inteiras.
\
tom \>
Como mencionamos na nota no começo deste artigo, precisamos escapar desses caracteres especiais porque estamos usando o bash. Alternativamente, você também pode usar aspas simples:
Os resultados são os mesmos. Certifique-se de usar aspas simples e não aspas duplas.
Outros recursos para Regexps avançados
Nós só atingimos a ponta do iceberg aqui. Você também pode pesquisar termos monetários delineados pelo marcador de moeda e pesquisar qualquer um dos três ou mais termos correspondentes. As coisas podem ficar muito complicadas. Se você estiver interessado em aprender mais sobre expressões regulares, por favor, dê uma olhada nas seguintes fontes.
- Zytrax.com tem algumas páginas com exemplos específicos de por que as coisas combinam ou não.
- Regular-Expressions.info também tem um guia matador para muitas das coisas mais avançadas, bem como uma página de referência útil.
- 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 on-line gratuita baseada em Flash chamada RegExr. Funciona enquanto você digita, é grátis e pode ser usado na maioria dos navegadores.
Você tem um uso favorito para expressões regulares? Sabe de um grande renamer em lote que os usa? Talvez você só queira se gabar do seu grep-fu. Contribua com seus pensamentos comentando!