terça-feira, 12 de julho de 2011

Expressões regulares (regular expressions)

Descoberta do dia: expressão regular é o tipo de coisa estranhamente útil.

Eu já tinha ouvido falar, claro; eu até fazia ideia do que era; na verdade, já tinha até usado uma ou outra coisa simples em buscas.  Talvez nem fossem expressões regulares, talvez conectores de expressões, "E" ou "AND", "OU" ou "OR", "$" e "*".


Mas hoje eu precisava de algo mais complexo: precisava encontrar, em um arquivo de texto .odt, tudo que estivesse entre parênteses e alterar o tamanho da fonte.  Dava pra mudar no braço, mas o texto era longo, os parênteses inúmeros.  

Então descobri que o LibreOffice aceita expressões regulares na função Search & Replace (Pesquisar e Substituir).  Nesta página do manual (help) do LibreOffice deu para entender o básico.  Mas foi neste bem escrito guia que eu consegui o que procurava.

Primeiro era necessário fazer o LibreOffice selecionar todos os parênteses e seu conteúdo -- números, espaços, palavras com maiúsculas e minúsculas.
Depois seria preciso substituir todo o conteúdo encontrado, sem efetuar qualquer modificação na substância, alterando apenas o tamanho da fonte.

Vou começar pelo fim e dizer que usei a seguinte expressão na caixa de busca (Search):

\([-0-9a-z ãõáéíóúâêôç/\.\,]+\)

para que o LibreOffice encontrasse (e selecionasse) todos os parênteses do texto com seu conteúdo.

Claro, várias dificuldades surgiram até chegar a esta expressão (que provavelmente não é a ideal -- tanto por poder ser simplificada ou aperfeiçoada:
- primeiro: era preciso fazer o programa entender que eu buscava algo entre parênteses.  Ocorre que os ( ) (parênteses) fazem parte das expressões regulares (caracteres especiais usados como "coringas" em buscas).  Então descobri que era necessário adicionar \ (backslash) na frente do parêntese de abertura e do de fechamento para que eles fossem entendidos literalmente, como parênteses e não como expressões regulares.
- segundo: precisava que todos os textos inseridos entre parênteses fossem reconhecidos, independente do seu tamanho ou conteúdo. Aí veio o resto daquele monstro:  vamos decorticá-lo: os [ ] (colchetes) servem para dizer "qualquer um dos caracteres" dentro dos colchetes, ou seja (no meu exemplo): "-" (hífen); "0-9" (números de 0 a 9); "a-z" (letras de "a" a "z"); " " (espaço); "ãõáéíóúâêôç" (para encontrar esses caracteres especiais); a / (barra simples) para encontrar barras; os dois caracteres \. (barra invertida seguida de ponto) para encontrar os pontos (.) -- que por ser caractere especial, exige a barra invertida antes, à semelhança dos parênteses; e, por fim, o sinal "+" (mais) para indicar que esses caracteres poderiam ser repetidos de 0 a infinitas vezes.

Faltava, então, dizer ao LibreOffice que aqueles textos encontrados (entre parênteses) ;-) deveriam ser rescritos com fonte diferente.
O primeiro passo foi o uso da expressão regular 

& (e comercial) 

na caixa de substituição (Replace), que faz com que o texto encontrado pela busca seja repetido na hora da substituição.
Depois basta indicar os detalhes da fonte a ser usada, o que é feito facilmente, na própria caixa de diálogo de Localizar e Substituir (Search and Replace), através do botão "Mais Opções" (More Options) e, em seguida, "Format".

Pronto.  Assim surgiu minha primeira expressão regular.

Nenhum comentário:

Postar um comentário