Dando continuidade aos nossos estudos sobre string, vamos agora explorar uma ferramenta poderosa, conhecida como regex.
O Que é Regex?
Regex é a abreviação de expressões regulares. Anteriormente, vimos que é possível usar em uma string o método contains para verificar a presença de um texto específico. No entanto, o método contains não é suficiente quando precisamos verificar padrões mais complexos, como um número de telefone, CPF ou e-mail.
Exemplo Prático de Uso de Regex
Criando a Variável de Texto
Vamos exemplificar para tornar isso mais claro. Ao abrir nossa IDE, temos apenas o método main, e vamos criar uma variável chamada texto, do tipo String, e atribuir a ela o seguinte valor: "Meu e-mail é [email protected]".
public class Principal {
public static void main(String[] args){
String texto = "Meu email é [email protected]";
}
}
Definindo um Padrão com Pattern
Como verificaríamos se dentro desse texto, que poderia conter milhões de linhas, há um padrão de e-mail? Não podemos procurar por "@gmail.com" especificamente, pois pode ser que o e-mail seja de outro provedor, como Yahoo, iCloud ou um corporativo, como "@alura.com.br". Portanto, precisamos usar um padrão, e é aí que entra a API Regex do Java, que nos ajudará a criar uma expressão regular para localizar um e-mail.
Para isso, utilizaremos duas classes que trabalham em conjunto: Pattern, onde determinamos o padrão da nossa expressão regular, e Matcher, que verifica se o padrão está presente no texto. Vamos criar um Pattern e chamá-lo de pattern, onde definiremos nosso padrão.
import java.util.regex.Pattern;
Pattern pattern =
Este padrão pode ser um pouco complexo, mas vamos começar com algo simples. Para criar, utilizamos Pattern.compile(), e declaramos nossa regex. Para reconhecer um e-mail, precisamos de um grupo de caracteres alfanuméricos, seguido por um arroba, mais outro grupo de caracteres alfanuméricos, um ponto, e mais um grupo.
Dentro da expressão, usamos um escape, que são duas barras invertidas (\\), seguida de w+, que indica a necessidade de pelo menos uma ocorrência de um caractere alfanumérico. Depois, temos um caractere literal, o arroba (@), que é essencial em qualquer e-mail.
Novamente, usamos o escape (\\) para incluir a expressão, seguido de w+ e um ponto literal (.). Por fim, incluímos mais um escape (\\) com outro w+ Isso indica que teremos um grupo de caracteres alfanuméricos.
import java.util.regex.Pattern;
public class Principal {
public static void main(String[] args){
String texto = "Meu email é [email protected]";
Pattern pattern = Pattern.compile("\w+@\w+.\w+")
}
}
Este é nosso padrão inicial para identificar um e-mail. Embora existam padrões mais complexos, este nos atende por enquanto.
Verificando Correspondências com Matcher
Após criar o padrão, precisamos verificar se há alguma estrutura no texto que corresponda a ele. É aí que entra o Matcher. Vamos criar um Matcher chamado matcher.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Principal {
public static void main(String[] args){
String texto = "Meu email é [email protected]";
Pattern pattern = Pattern.compile("\w+@\w+.\w+");
Matcher matcher =
}
}
Com o Matcher, aplicamos nosso padrão ao texto usando pattern.matcher(texto). Uma vez aplicado o padrão, verificamos se ele encontrou algo e solicitamos que nos traga o resultado.
Se matcher.find() retornar verdadeiro, imprimimos o resultado com System.out.println(matcher.group()). O método group sintetiza o resultado e nos traz o que foi encontrado.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Principal {
public static void main(String[] args){
String texto = "Meu email é [email protected]";
Pattern pattern = Pattern.compile("\w+@\w+.\w+");
Matcher matcher = pattern.matcher(texto);
if (matcher.find()) {
System.out.println(matcher.group());
}
}
}
Ao executar, ele imprime "[email protected]".
Se alterarmos para "alura.com" , ele ainda reconhecerá e retornará o e-mail. Se mudarmos para "alura.com.br", ele retorna até "alura.com", mas corta o ".br", pois nosso padrão não o contempla, embora possa ser incluído posteriormente como opcional. Assim, montamos expressões regulares.
Elementos e Caracteres Especiais em Regex
O que significa cada elemento da expressão? Por que usamos w e o escape? Temos uma tabela que mostra todos os caracteres especiais:
| Símbolo | Descrição |
|---|
. | Caractere, exceto quebra de linha |
\d | Dígito (0-9) |
\D | Caractere que não é um dígito |
\w | Caractere alfanumérico |
\W | Caractere não alfanumérico |
\s | Espaço em branco |
\S | Caractere que não é espaço em branco |
^ | Início da string |
$ | Fim da string |
Se precisarmos de dígitos de 0 a 9, ou qualquer caractere que não seja um dígito, usamos D maiúsculo. Para caracteres alfanuméricos, usamos w minúsculo. Se quisermos qualquer caractere que não seja alfanumérico, usamos W maiúsculo.
Existem vários caracteres especiais que podemos utilizar, além de classes de caracteres, onde definimos caracteres específicos que poderíamos usar. Quando utilizamos colchetes em expressões regulares, qualquer caractere dentro deles, como A, B ou C, será considerado. Se utilizarmos o acento circunflexo ^, significa qualquer caractere, exceto os especificados. Existem várias combinações possíveis ao trabalhar com regex para criar o padrão desejado.
| Símbolo | Descrição |
|---|
[abc] | Qualquer caractere dentro dos colchetes ('a', 'b' ou 'c') |
[^abc] | Qualquer caractere exceto os que estejam dentro dos colchetes |
[a-z] | Qualquer caractere minúsculo de 'a' a 'z' |
[A-Z] | Qualquer caractere maiúsculo de 'A' a 'Z' |
[0-9] | Qualquer dígito |
[a-zA-Z] | Qualquer letra maiúscula ou minúscula |
Além disso, temos os quantificadores, que indicam, por exemplo, que deve haver zero ou mais ocorrências, ou pelo menos uma ou mais ocorrências. Por isso, utilizamos \w+, onde \w representa um caractere alfanumérico e o sinal de mais indica uma ou mais ocorrências. Podemos definir um número exato de ocorrências dentro dos colchetes ou especificar ocorrências opcionais, como N ou mais ocorrências. Há diversas combinações possíveis.
| Símbolo | Descrição |
|---|
* | 0 ou mais ocorrências do padrão anterior |
+ | 1 ou mais ocorrências do padrão anterior |
? | 0 ou 1 ocorrência do padrão anterior |
{n} | Exatamente n ocorrências do padrão anterior |
{n,} | n ou mais ocorrências do padrão anterior |
{n,m} | Entre n e m ocorrências do padrão anterior |
Na classe Matcher, temos métodos como find, que verifica se ocorreu uma correspondência, e group, que agrupa e exibe as ocorrências. Outros métodos incluem matches, lookingAt e replaceAll, que encontram e substituem padrões.
A classe oferece várias opções que podemos utilizar. Por ser uma classe Java, podemos consultar o Javadoc para exemplos. Basta clicar com a tecla "Ctrl" pressionada para acessar a classe e verificar seus métodos e possibilidades.
| Método | Descrição |
|---|
find | Procura por um padrão em qualquer parte da string. Retorna o primeiro resultado encontrado. |
matches | Verifica se a string inteira corresponde ao padrão. |
lookingAt | Verifica se a string parcialmente corresponde ao padrão. |
replaceAll | Substitui ocorrências do padrão por uma string. |
Formatando Telefones com Regex
Vamos demonstrar um exemplo de formatação de telefone, onde passamos um número sem formatação e ele retorna formatado.
Para isso, criamos um método chamado formatarTelefone, que retorna uma string formatada. A regex está estruturada para capturar grupos específicos do número de telefone:
- Grupo 1 (DDD): Dois dígitos
(\\d{2}); - Grupo 2 (Parte principal): Quatro ou cinco dígitos (
(\\d{4,5})), que podem representar telefones fixos ou celulares; - Grupo 3 (Sufixo): Quatro dígitos finais (
(\\d{4})).
Diferentemente da validação de e-mail (onde usamos um único grupo), aqui usamos os parênteses para definir grupos separados e permitir a formatação personalizada.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Principal {
public static void main(String[] args) {
String texto = "Meu email é [email protected]";
Pattern pattern = Pattern.compile("\w+@\w+.\w+");
Matcher matcher = pattern.matcher(texto);
if (matcher.find()) {
System.out.println(matcher.group());
}
}
public static String formatarTelefone(String telefone) {
String regex = "(\\d{2})(\\d{4,5})(\\d{4})";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(telefone);
if (matcher.matches()) {
return String.format("(%s) %s-%s", matcher.group(1), matcher.group(2), matcher.group(3));
}
return "Número de telefone inválido!";
}
}
Ao chamar System.out.println com formatarTelefone, passamos um número sem formatação, como 2199887744, e ele deve retornar formatado.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Principal {
public static void main(String[] args) {
String texto = "Meu email é [email protected]";
Pattern pattern = Pattern.compile("\w+@\w+.\w+");
Matcher matcher = pattern.matcher(texto);
if (matcher.find()) {
System.out.println(matcher.group());
}
System.out.println(formatarTelefone("2199887744"));
}
public static String formatarTelefone(String telefone) {
String regex = "(\\d{2})(\\d{4,5})(\\d{4})";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(telefone);
if (matcher.matches()) {
return String.format("(%s) %s-%s", matcher.group(1), matcher.group(2), matcher.group(3));
}
return "Número de telefone inválido!";
}
}
Ao executar, é retornado o e-mail com o telefone formatado:
[email protected]
(21) 9988-7744
Conclusão e Recursos Adicionais
As expressões regulares são extremamente úteis e valem a pena serem aprofundadas. Embora possam parecer complicadas, ferramentas de inteligência artificial e sites como o regex101 ajudam na criação e validação de padrões.
No site regex101.com, podemos escolher Java e testar expressões regulares, como a utilizada para e-mails. Primeiro, inserimos a expressão "\\w+@\\w+.\\w+" no campo "REGULAR EXPRESSION" e, em seguida, inserimos o texto "Meu e-mail é [email protected]" no campo "TEST STRING".
Ao fazer isso, o site sublinha o padrão "[email protected]". Se alterarmos o texto para "Meu e-mail é [email protected] e do meu amigo é [email protected]", ele sublinhará os dois e-mails, "[email protected]" e "[email protected]", identificados como padrão.
Esperamos que este conteúdo tenha sido útil. É importante praticar ao trabalhar com strings. Em caso de dúvidas, entre em contato pelo fórum ou Discord. Disponibilizamos um curso em nossa plataforma que aprofunda o conhecimento em regex, embora não seja em Java.
Até o próximo curso!