Quem trabalha com tecnologia e desenvolvimento sabe que códigos-fonte podem, em muitos cenários, aumentar rapidamente o seu tamanho. Quanto maior for a sua estrutura, mais complexa é a modificação e a manipulação de elementos. Um dos mecanismos que podem ser empregados para otimizar essa atividade é adotar o uso de expressões regulares.
Expressões regulares ou Regex, como também são chamadas, são formas simples de trocar elementos de um código-fonte. Elas podem ser aplicadas na criação de programas, ou mesmo em sistemas e páginas web. Para quem busca ser uma pessoa que trabalha com TI produtiva, esse tipo de ferramenta é fundamental na bagagem.
Quer saber mais sobre as expressões regulares e a sua importância? Então, confira o post que preparamos, a seguir:
- O que é expressão regular (Regex)?
- Quais os principais conceitos de expressões regulares?
- O que é uma regex engine e para que serve?
- Quais as diferenças entre “caracteres literais” e “caracteres especiais”?
- Quais métodos são usados em Regex?
- O que são as Flags e quais são elas?
- Qual a função dos parênteses em Regex?
- Como criar as primeiras regex? Veja 10 exemplos práticos de uso!
- Como uma expressão regular é utilizada na prática? Veja 5 maneiras e em 5 linguagens diferentes!
- Vamos ver o que cada elemento da Regex significa?
- O que é o Regex 101 e para que serve?
Boa leitura!
O que é expressão regular (Regex)?
As expressões regulares são padrões que pessoas que trabalham com desenvolvimento de TI podem adotar para selecionar caracteres (ou combinações de caracteres) em uma string. No caso do JavaScript, aliás, as expressões regulares são, também, objetos. Assim, a gestão do código-fonte de um programa pode ser feita com mais segurança e agilidade.
As expressões regulares, em outras palavras, permitem que profissionais de TI extraiam ou troquem partes do texto do código-fonte. Além disso, podem ser utilizadas para modificar endereços, links de imagens e a formatação de conteúdos em uma página HTML. Se a pessoa desejar, elas podem ser empregadas até para a remoção de caracteres inválidos.
Quais os principais conceitos de expressões regulares?
Como apontamos, as expressões regulares são representações que facilitam a busca por padrões no texto da pessoa desenvolvedora. Isso torna a manipulação do código-fonte mais ágil e robusta. Veja, a seguir, os conceitos que devem sempre fazer parte do seu dia a dia para garantir que elas sejam utilizadas corretamente!
Classes
As classes ajudam a encontrar múltiplos caracteres ao mesmo tempo. Às vezes, você pode procurar apenas pelas variáveis que tenham a letra A, por exemplo, em strings presentes em seu código-fonte.
Uma classe deve ser definida com o apoio de colchetes []. Isso indica ao seu sistema que você busca por um conjunto específico de caracteres. Há algumas configurações que facilitam esse trabalho, aliás, que são as seguintes:
- [A-z] indica que todas as letras do alfabeto devem ser apontadas;
- [0-9] indica ao software que todos os números devem ser destacados (pode ser substituído por \d);
- [a-z0-9] aponta ao sistema que você busca letras e números (pode ser substituído pela expressão \w);
- [a-z] limita a busca a todas as letras minúsculas;
- ^ dentro dos colchetes ignora todas as combinações da classe (por exemplo, [^as] ignora todas as combinações que tenham “as”);
- [A-Z] limita a sua busca apenas às letras maiúsculas;
- W reduz a busca apenas a caracteres que não sejam alfanuméricos, como espaços e símbolos.
Âncoras
Âncoras são úteis quando você deseja recuperar as posições que estão entre os caracteres. Porém, esse trabalho será executado sem a exibição dos caracteres indicados. Ou seja, ela aponta o que está próximo do referencial que você indicar, sem apontar esse referencial.
As âncoras podem ser utilizadas de duas formas, que são as seguintes:
com um ^, que recupera todos os termos que estiverem no início da linha, por exemplo:
^bolo
Isso aponta todas as vezes em que a palavra “bolo” está no começo da linha;
com um $, para apontar as vezes em que a expressão está no fim da linha, por exemplo:
bolo$
O que indica todos os casos em que a palavra “bolo” está no fim da linha.
Modos
Com o apoio de modos, você consegue ampliar o escopo das suas buscas. Por exemplo, para limitar a sua operação a itens como CaRrO, carro e CARRO, basta digitar:
(?i)carro
Assim, você não precisa digitar todas as formas de escrever um termo na sua expressão.
Buscas por múltiplos padrões
Às vezes, você quer empregar expressões regulares para encontrar dois ou mais padrões específicos. Para isso, basta utilizar |, que funciona como o termo OU/OR nas linguagens de programação. Assim, a expressão pode lidar com mais de um padrão facilmente.
O que é uma regex engine e para que serve?
Uma regex engine é um programa que analisa uma string e verifica se ela corresponde a uma expressão regular. Se a string corresponder, a regex engine vai devolver um resultado. Caso contrário, retornará um erro.
As regex engines são usadas para validar strings de entrada de um usuário em uma aplicação, por exemplo, como endereços de e-mail ou números de telefone. Também podem ser usadas para extrair informações de uma string, como um nome ou uma data.
Quais as diferenças entre “caracteres literais” e “caracteres especiais”?
O termo “caractere” é usado em programação para se referir a um único símbolo, letra ou número. Já o termo “literal” significa exatamente o que está escrito, sem interpretações extras. Por exemplo, o literal “abc” representa apenas as letras A, B e C, sem mais nada.
Os caracteres especiais são aqueles que têm uma função específica em determinado contexto. Em regex, os caracteres especiais são aqueles que têm alguma função de busca/troca de texto. Alguns exemplos são: . (ponto), * (asterisco) e + (sinal de mais). Já os caracteres literais são todos os outros caracteres que não têm essas funções especiais.
Quais métodos são usados em Regex?
Os métodos em expressões regulares permitem que você execute uma ação específica em determinado padrão de texto. Por exemplo, o método match pode ser usado para verificar se um texto corresponde a um padrão especificado, enquanto o método replace pode ser usado para substituir todas as instâncias de determinado texto por outro texto.
Por isso, saber usar os métodos em expressões regulares pode ser extremamente útil ao processar e manipular texto de diversas formas, nas mais diferentes etapas do desenvolvimento de uma aplicação. Dessa forma, optamos por trazer uma tabela com cada um dos métodos utilizados em Regex, confira!
Métodos Regex | ||
---|---|---|
Framework | Descrição | Modelo |
IsMatch | “É correspondente?” — o método indica a entrada de uma string associada a ele | Regex.IsMatch( input, pattern, options (opcional) ) |
Match | Pesquisa e aponta correspondência de uma string e retorna resultado como um único objeto | Regex.Match( input, pattern, options (opcional) ) |
Matches | Pesquisa a string inteira e retorna um objeto MatchCollection contendo todas as ocorrências do padrão | Regex.Matches( input, pattern, options (opcional) ) |
Replace | É utilizado para substituir caracteres em uma determinada string. Ele recebe, obrigatoriamente, dois parâmetros: o primeiro é a string de origem, e o segundo é a string que será substituída | Regex.Replace( input, pattern, replacement, options (opcional) ) |
Split | É utilizado para quebrar uma string em um array de strings, usando um separador especificado | Regex.Split( input, pattern, options (opcional) ) |
Unescape | Remove todos os caracteres de escape (como \t e \n) de uma string | Regex.Unescape( input, pattern) |
Opções de Execução — Options | ||
Framework | Caractere Inline | Descrição |
Compiled | N/A | compila as expressões para um modelo assembly |
ExplicitCapture | n | se essa opção não for usada, algumas das opções de captura podem permitir que os valores sejam capturados de forma implícita, o que pode levar a resultados imprevisíveis. A option ExplicitCapture garante que todos os valores sejam capturados de forma explícita, o que torna mais fácil para o programador prever e controlar o comportamento do Regex |
Global | g | pesquisa globalmente para todas as ocorrências |
IgnoreCase | i | case-insensitive — não diferencia maiúsculas e minúsculas |
IgnorePatternWhitespace | x | permite espaço em branco e/ou comentários no pattern |
Multiline | m | a option Multiline altera o comportamento da função ^ e $, fazendo com que elas sejam interpretadas apenas para as linhas |
None | N/A | nenhuma opção especificada |
RightToLeft | N/A | move da direita para esquerda |
SingleLine | s | a SingleLine option em Regex é usada para indicar que a string deve ser analisada como uma linha única, independentemente de quaisquer caracteres de nova linha (\n ou \r) que possa conter |
O que são as Flags e quais são elas?
As flags em Regex são opções que podem ser usadas para alterar o comportamento do padrão de pesquisa. Quer saber quais são elas? As principais flags em Regex são: i, g, m, u e y:
- flag “i”: ignora diferenças entre maiúsculas e minúsculas;
- flag “g”: faz com que todas as ocorrências do padrão sejam pesquisadas (em vez de apenas a primeira);
- flag “m”: torna possível usar vários caracteres de nova linha como delimitadores;
- flag “u”: trata strings como codificadas em UTF-8;
- flag y: é uma flag global, tem o mesmo efeito da flag g, mas aplica-se apenas à última posição na string.
Para usar uma flag (ou sinalizador, como também são chamadas), basta seguir o padrão:
var regex = /pattern/flags; //ou:
var regex = new RegExp("pattern", "flags");
Qual a função dos parênteses em Regex?
Os ( ) criam um grupo de caracteres em uma expressão regular, resumidamente. Grupos de caracteres são úteis para agrupar vários caracteres como um único elemento. Por exemplo, os dígitos (1234567890) podem ser agrupados para formar um número inteiro.
Dessa forma, pode ser criado mais de um grupo, se os caracteres abrem e fecham parênteses adicionais. Por exemplo, (123(45)6) pode ser uma expressão regular que contém dois grupos: o primeiro é formado pelos dígitos 1 a 6; o segundo é formado apenas pelo número 45.
Ou seja, o que está entre os parênteses é o grupo de expressão regular, e só existe um por padrão. Se nomes, por exemplo, forem utilizados para as expressões regulares, não há limite em quantos podem ser criados com a utilização desse recurso.
Manipulações mais complexas de expressões regulares tendem a variar para cada linguagem. O PHP, por exemplo, tem várias funções para trabalhar com expressões regulares. Dentre elas, as principais são:
- preg_match(): procura por uma correspondência em um texto;
- preg_match_all(): procura por todas as correspondências em um texto, e retorna tudo em um array;
- preg_replace(): substitui parte de um string de acordo com a regex fornecida.
Então, vale a pena pesquisar esses detalhes para sua linguagem de programação favorita.
Como criar as primeiras regex? Veja 10 exemplos práticos de uso!
Criar as primeiras Regex pode ser um desafio para as pessoas que iniciam na programação. A seguir, você acompanha alguns exemplos que trazemos para ilustrar a utilização das expressões regulares na prática e facilitar essa parte para você.
Lembrando que você poderá testar cada uma em ferramentas online, como a Regex 101. Outra coisa importante é saber que as expressões que mostramos na sequência estão definidas por uma variável e de forma literal. Portanto, basta copiar o código depois da primeira “/” que ele estará pronto para ser observado e manipulado.
Acompanhe uma lista com 10 exemplos práticos de expressões regulares, prontas para serem usadas em seus projetos!
1. Criando uma Regex que aceite somente números de 0 a 9:
var regex = /[0-9]/; 2.
2. Criando uma Regex que aceite somente números de 0 a 9 e letras maiúsculas:
var regex = /[A-Z0-9]/;
3. Criando uma Regex que aceite qualquer coisa, desde números até caracteres especiais:
var regex = /./;
4. Criando uma Regex que aceite qualquer coisa, desde números até caracteres especiais, mas que seja diferente de uma letra:
var regex = /[^A-Z]/;
5. Criando uma Regex para o telefone celular (com 9 dígitos):
var regex = /\d{9}/;
6. Criando uma Regex para o CPF (com 11 dígitos):
var regex = /\d{11}/;
7. Criando uma Regex para a data no formato dd/mm/aaaa:
var regex = /\d{2}\/\d{2}\/\d{4}$/;
8. Criando uma Regex para a data no formato dd/mm/aaaa hh:mm:ss:
var regex = /\d{2}\/\d{2}\/\d{4}\s+\d{2}:\d{2}:\d{2}$/;
9. Criando uma Regex que aceite somente letras maiúsculas e minúsculas, espaços em branco e caracteres acentuados (acentuação grave – ‘`’):
var regex = /[a-zA-ZÀ-Üà-ü0-9_\-\.\' `]*/;
10. Criando uma Regex para o endereço de um e-mail:
var regex = /^[a-z0-9.]+@[a-z0-9]+\.[a-z]+\.([a-z]+)/i
Repare que o e-mail pede, obrigatoriamente, o endereço de localização (um “.br”, por exemplo). Não haverá correspondências se o endereço de e-mail não tiver esse detalhe. Para buscar por e-mails apenas com “.com”, faríamos dessa forma:
var regex = /^[a-z0-9.]+@[a-z0-9]+\.[a-z])/i
Sinta-se livre para mudar e modificar todas as expressões que passamos aqui! Lembre-se de que programação se aprende muito mais facilmente com a prática! Mãos à obra!
Adendo: regex usando construtores
Construtores são funções especiais que criam objetos. Em JavaScript, por exemplo, um construtor é uma função que tem a palavra-chave “prototype” como propriedade. Quando uma função é chamada com a palavra-chave “new”, ela se torna um construtor.
O mesmo acontece no PHP — para criarmos um novo Regex por meio de um de seus construtores, fazemos assim:
$regex = new Regex('/pattern/');
Como uma expressão regular é utilizada na prática? Veja 5 maneiras e em 5 linguagens diferentes!
Um cenário em que expressões regulares são muito utilizadas é o preenchimento de formulários. Aqui, quem cria o sistema ou página web deve garantir que as pessoas usuárias farão o preenchimento do documento dentro de certo conjunto de padrões. Os dados de e-mail, por exemplo, precisam ser sempre correspondentes a endereços reais.
Para que isso seja possível, uma sequência de expressões regulares são implementadas. Assim, elas podem apontar para o programa que o usuário fez o uso de caracteres inválidos e exibir uma mensagem de erros. A expressão, normalmente, é moldada da seguinte maneira:
^\w*(\.\w*)?@\w*\.[a-z]+(\.[a-z]+)?$
Há diversas maneiras de adotarmos o Regex em nossas aplicações. Mesmo que cada linguagem seja diferente, você perceberá, por meio dos exemplos que escolhemos, que as expressões regulares seguem um padrão em sua utilização. Observe e teste o máximo possível!
1. Exemplo de Regex em um formulário em HTML:
<form action="">
<input type="text" name="username" pattern="[a-zA-Z0-9]{3,16}" title="O nome de usuário deve conter apenas letras e/ou números, e ter entre 3 e 16 caracteres." required>
<button type="submit">Enviar</button>
</form>
2. Exemplo de aplicação de Regex para confirmação em um formulário em PHP:
if (preg_match("/^[a-zA-Z0-9]{3,16}$/",
$_POST["username"]))
3. Exemplo de aplicação de Regex para confirmação de nome de usuário em um formulário Javascript:
var username = document.forms["myForm"]["username"];
var regex = /^[a-zA-Z0-9]{3,16}$/;
if (regex.test(username.value) == false) { // o nome de usuário é inválido }
else { // o nome de usuário é válido }
3. Exemplo de formulário com confirmação do CPF usando Regex em Python:
import re
nome = input("Informe seu nome: ")
cpf = input("Informe seu CPF: ")
#Verifica se foi informado um nome válido
if not re.match("^[A-Za-zÀ-ú ]+$",
nome): print("Por favor, informe um nome válido!")
exit()
#Verifica se o CPF é válido
if not re.match("^\d{3}\.\d{3}\.\d{3}\-\d{2}$",
cpf): print ("CPF inválido!")
exit()
print ("Dados cadastrados com sucesso!")
5. Exemplo de Regex em uma aplicação em Java, removendo strings determinadas e realizando a substituição:
public class RegexExample {
public static void main(String[] args) {
// Removenmdo todos os espaços em branco de nossa string:
String str = "abcd efg hijk lmn";
System.out.println(str.replaceAll("\\s", ""));
// Substitui todos não-dígitos da nossa string:
str = "abcd1234efg5678hijklmn";
System.out.println(str.replaceAll("\\D", ""));
}
}
Vamos ver o que cada elemento da Regex significa?
Inserida no seu código, cada expressão regular que mostraremos consegue filtrar qualquer endereço compatível que não esteja dentro do padrão utilizado pelos provedores de e-mail. Opções como “[]@[].org” ou “@com.@” serão apontadas como inválidas.
Assim, o seu formulário terá apenas respostas válidas. A seguir, você poderá conferir os detalhes de cada um desses códigos:
- a expressão ^ aponta para o sistema que uma nova linha ou string iniciou;
- \w* filtra caracteres alfanuméricos, como já apontamos. O asterisco é utilizado para garantir que todos os caracteres compatíveis com essa regra sejam apontados;
- em (\.\w*) os parênteses indicam o início e o fim de um agrupamento. A expressão \. é adotada para apontar a detecção de um ponto final. Já o \w* detecta caracteres alfanuméricos;
- `.[a-z] aponta a existência de um ponto seguido de letras minúsculas (isso ajuda a identificar se o usuário digitou algo como .com, .org ou .net);
- @ limita apenas a endereços com o símbolo @;
- + indica que todos os itens que estiverem imediatamente após esse símbolo devem aparecer uma ou mais vezes no dado inserido pelo usuário;
- (\.[a-z]+) aponta que a letras minúsculas seguidas de um ponto final devem aparecer pelo menos uma vez após o símbolo @;
- ? indica que a regra que vier imediatamente antes do interrogação deve aparecer na expressão nenhuma ou apenas uma vez;
- $ sinaliza o fim da regra.
Expressões regulares são um grande ativo para quem trabalha com tecnologia. Elas auxiliam profissionais a serem mais eficazes e ágeis na sua rotina de trabalho. Além disso, evitam erros na filtragem de conteúdos.
Portanto, ao criar sistemas, sempre se apoie nas expressões regulares. Com elas, você pode diminuir o tempo necessário para lidar com expressões, modificar o código com mais rapidez e, até mesmo, garantir que formulários sejam preenchidos corretamente. Ou seja, focar o que for realmente prioritário e evitar atividades muito repetitivas nunca será uma dificuldade.
O que é o Regex 101 e para que serve?
Já citamos no decorrer do texto, mas é uma ferramenta tão importante para quem precisa trabalhar com Regex que optamos por chamar um pouco mais de atenção para ela. O Regex 101 é um dos ambientes de testes de expressões regulares mais completos do mercado e pode ser acessado no endereço https://regex101.com/.
É gratuito e disponibiliza uma série de ferramentas, recursos e uma comunidade atenciosa!
Concluindo, exploramos, durante todo nosso guia, cada um dos principais aspectos e conceitos que fazem parte da manipulação de expressões regulares nas mais diferentes linguagens de programação, passando por implementações simples para auxiliar o seu entendimento do tema na prática.
Vimos diversos métodos que podem ser aplicados, assim como as funções oferecidas pela Regex ao manipularmos entradas e dados e fazer a confirmação de validade dos mesmos. Apresentamos algumas listas detalhadas dos elementos do recuso, além de apresentar ferramentas facilitadoras para aplicação dessas expressões.
Gostou das nossas dicas e dos exemplos que trouxemos? Quer saber mais sobre programação e mandar bem no mercado de desenvolvimento? Então, não deixe de conferir um glossário completo com termos de tecnologia que preparamos em nosso blog!