Gilmar Piccin Postado Junho 10, 2022 Compartilhar Postado Junho 10, 2022 O objetivo deste artigo é apresentar a estrutura de um regex e aprofundar em cada aspecto e que possa lhe servir como um guia podendo sempre consultar para compreender um regex ou cria-lo do zero. Servindo como um complemento ao artigo: Para facilitar e organizar nosso pensamento é importante que definamos alguns passos: 1º Precisamos definir um alvo (Target) é o nossa fonte de dados bruta; 2º Definir qual a nossa necessidade (ex: extrair uma data); 3º Aplicarmos o padrão (pattern) baseado na nossa necessidade; Exemplo: Target = 1233P86949A9822R1A165B568E22N35S Necessidade = descriptografar esse conteúdo desconsiderando os dígitos Pattern = [^\d] Resultado = 8 matchs P | A | R | A | B | E | N | S Para testar essa solução podemos utilizar https://www.regextester.com/ Agora vamos nos aprofundar em cada aspecto das expressões regulares para entender como chegar nesse resultado Quantifier Usamos quantifier para dizer quantas vezes determina expressão deve aparecer em sequência ? - zero ou uma vez. * - zero ou mais vezes. + - uma ou mais vezes. {n} - exatamente n vezes. {n,} - no mínimo n vezes. {n,m}- no mínimo n vezes, no máximo m vezes. . - o "ponto" significa qualquer char { e }- as chaves servem para definir uma quantidade de caracteres específicas que é desejado encontrar. Por exemplo: a{3} - letra a 3 vezes. \d* - um dígito zero ou mais vezes. Se quisermos procurar pelo . ou * literalmente (sem significado especial), devemos utilizar o caractere \ \ - podemos escapar meta-chars, por exemplo \.. | - “Pipe” é usado como operador lógico OR Classe de caractere Definimos classes de caracteres dentro de [ ] existem várias classes prontas que nos auxiliam [A-Z] - significa de A até Z, sempre maiúscula. [a-z] - significa de a até z, sempre minúscula. [A-Za-z] - significa A-Z ou a-z. [abc] - significa a, b ou c. [123] - significa 1,2 ou 3 \d - (minúsculo) significa todos os dígitos e é atalho para [0-9] \w - (minúsculo) significa word char e é um atalho para [A-Za-z0-9_]. \s - significa whitespace normalmente é um atalho para [ \t\r\n\f] onde: O primeiro caractere é um espaço branco. \t - é um tab. \r - é carriage return. \n - é newline. \f - é form feed. Obs: as classes \w ou [A-Za-z] não retornam caracteres com acento, para tal é necessário adicionar os caracteres desejados exemplo: Target = 123JoãoCaçula4567 Pattern = [A-Za-zãç] isso serve para qualquer caractere com acento Uma maneira mais simples para resolver esse problema é usar a classe [À-ü] Pattern = [A-Za-zÀ-ü] Combinando classes com quantifier Podemos combinar classes com quantifier para especificar cada vez mais nossa regex [.-]* - ponto ou hífen zero, uma ou mais vezes. [.-]{1} - ponto ou hífen uma vez. [.-]? - ponto ou hífen zero ou uma vez. Âncoras Quando precisamos que encontrar determinada informação delimitando uma parte da informação podemos usar as âncoras: \b - (minúsculo) é uma âncora que seleciona um word boundary, isso é o início ou fim da palavra. ^ - Garantir que nada vem antes. $ - Garantir que nada vem depois. \B - (B maiúsculo) non-word-boundary comportamento inverso a sílaba alvo deve aparecer dentro de uma palavra, nunca no início ou fim. Exemplos de uso do \B : Target = 123aaa456 Pattern = \Baaa\B ou usando quantifier \Ba{3}\B Grupos Quando queremos retornar alguma parte dentro da nossa expressão podemos colocar dentro de grupos para isso usamos ( ) () - Declarar um grupo ?: - Non-Capturing group, não retornar deste grupo Exemplo remover a palavra teste de uma frase Target = este é um teste de grupo Pattern = (?:teste\s+) Backreferences Quando queremos que um comportamento seja replicado dentro de um grupo podemos usar a sua referência invés de duplicar o mesmo padrão, para isso usa-se um \ seguido pelo número do grupo, começando com 1 Exemplo: Suponhamos que temos que extrair o conteúdo de dentro de uma tag de um arquivo xml <tag1 id="teste">teste</tag1> <tag2 id="teste">teste2</tag2> <tag1 id="teste">teste3</tag2> - não deve capturar Podemos solucionar da seguinte forma: Pattern = <(tag1|tag2).+?>([\w]+)</(tag1|tag2)> ou então podemos usar a referencia desse grupo: Pattern = <(tag1|tag2).+?>([\w]+)<\/\1> Negação As vezes é mais vantajoso selecionarmos a informação que não queremos e para isso podemos utilizar \W - (maiúsculo) é a non-word char , ou seja tudo que não é um word char. \W é um atalho para [^\w]. \D - (maiúsculo) é um non-digit, sendo \D um atalho para [^\d] Repare também que não usamos a meta-char ^ como âncora pois aparece dentro de uma classe [^\d] seu significado nesta situação é de negação Exemplos comuns Validar CPF Pattern= (\d{3})[.]?(\d{3})[.]?(\d{3})[-]?(\d{2}) Validar CNPJ Pattern = (\d{2})[.]?(\d{3})[.]?(\d{3})[/]?(\d{4})[-]?(\d{2}) Validar CPF e CNPJ ao mesmo tempo Pattern = ((\d{2})[.]?(\d{3})[.]?(\d{3})[/]?(\d{4})[-]?(\d{2}))|((\d{3})[.]?(\d{3})[.]?(\d{3})[-]?(\d{2})) Validar Inscrição Estadual Pattern = (?=\d)(?![\d/\-.]*[/\-.]{2})[\d/\-.]{1,16}\d Validar CEP Pattern= (\d{2}[.]?\d{3})[-]?(\d{3}) 1 2 Link to comment Compartilhe em outros sites Outras opções de compartilhamento...
Postagens Recomendadas
Crie uma conta ou entre para comentar 😀
Você precisa ser um membro para deixar um comentário.
Crie a sua conta
Participe da nossa comunidade, crie sua conta.
Criar minha conta agoraÉ bem rápido!
Entrar
Você já tem uma conta?
Entrar agoraFaça o login agora.