
-FAMILY: Verdana">Expressões Regulares em Java
Utilize os recursos da java.util.regex para processar texto com facilidade
Explore as APIs do Java para busca e substituição de texto, e veja como utilizá-las de forma eficiente
A linguagem Java não é famosa pelas suas facilidades de processamento de texto, pois o Java não foi criado originalmente para gerar páginas web, fazer parsing, ou processamento de documentos. No entanto, o Java hoje é utilizado em praticamente todos os domínios de aplicação, e já há um bom tempo possui uma completa gama de recursos para tratamento de texto.
Alguns destes recursos, aliás, são de estirpe do Java 1.0, e talvez falhemos em apreciá-los porque sempre estiveram disponíveis. Por exemplo, suporte ao padrão Unicode. Em linguagens e APIs que usei antes de Java, o suporte para Unicode não era default, e sua programação era complicada pela duplicação de APIs (versões ASCII e Unicode das mesmas funções) e necessidades constantes de fazer conversões entre estes formatos. No Java nada disso existe: qualquer texto – String ou char – é sempre Unicode. Só dá para perceber como o Java é simples ao compará-lo com outras linguagens, inclusive algumas que são famosas pelo suporte a processamento de texto.
Neste artigo, examinaremos uma API simples, porém poderosa e essencial: a java.util.regex.
Expressões regulares
As expressões regulares surgiram da teoria de linguagens formais, como uma alternativa simples e prática para processamento de trechos de texto curtos e pouco complexos. Tecnicamente, toda expressão regular (regex) é uma gramática, que define uma linguagem.
Uma linguagem, se você nunca se perguntou, tem a seguinte definição: é o conjunto – possivelmente infinito – de todos os inputs que são compatíveis com certa gramática. Por exemplo, a “linguagem Java” é o conjunto de todos os programas-fonte Java válidos. Ao rodarmos um compilador como o javac, este determina se o conteúdo de um arquivo fonte (*.java) pertence a este conjunto.
Há uma sofisticada teoria de gramáticas formais, parte da disciplina de Compiladores que faz parte de currículos de 3º. grau em computação, que permite criar parsers, compiladores e outras ferramentas que processam fontes de linguagens como Java, entre outros inputs altamente estruturados. Mas essa teoria é pesada e envolve ferramentas também complexas (no Java, representadas pelo JavaCC e ANTLR). Não é algo adequado para necessidades simples, muitas vezes ad-hoc, de parsing, como por exemplo: como determinar se uma string, como “07/12/2008”, contém uma data? Com expressões regulares (ou regex), isso é fácil: “\d\d/\d\d/\d\d\d\d”.
Uma regex é composta de meta-caracteres e caracteres comuns. No exemplo, ‘\d’ é um meta-caractere que significa “dígito”. Outra forma de especificar um dígito seria “[0-9]”, nesse caso usando a sintaxe de definição de classe de caracteres – mas como esta classe “dígito” é de uso muito comum, é abreviada pelo meta-caractere ‘\d’. A regex de exemplo significa: algum dígito, seguido de algum outro dígito, seguido de um ‘/’, etc. É comum haver várias formas de escrever a mesma regex: para dar outro exemplo, ao invés de “\d\d” poderíamos usar “\d{2}”. Neste artigo não vamos focar nas regex em si; veja o quadro “A linguagem de regex do Java”.
A linguagem de regex do Java
Uma descrição completa da sintaxe de regex do Java seria bastante longa, e é um assunto já conhecido de muitos leitores, por ser um recurso comum de várias linguagens e ferramentas (como grep, editores de texto, e até bancos de dados). A referência detalhada desta sintaxe está disponível no javadoc da classe java.util.regex.Pattern.
A maioria das linguagens de regex derivam do padrão POSIX 1003.2, o qual define duas formas de regex. A forma “obsoleta” ou “básica” é usada somente por poucos programas Unix antiquados, como o editor ed. A forma “estendida” ou “moderna” é bem mais popular, sendo amplamente utilizada por ferramentas de sistemas Unix / Linux e também muitas linguagens e aplicações.
Outro padrão importante é o da linguagem Perl, cuja sintaxe de regex é baseada no padrão POSIX, mas recebeu diversas melhorias, sendo mais flexível e poderosa, e por isso muito popular. Esta popularidade gerou o projeto PCRE (Perl Compatible Regular Expressions), uma biblioteca nativa que implementa um avaliador de regex extremamente compatível com o Perl. O PCRE é utilizado por outros programas, como Apache httpd, KDE, PHP, Safari, e muitos outros.
Quando a API java.util.regex ...