Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

A para o desafio não poderia ser dessa forma também?

([a-zA-Z].+)|([0-3]\d\/\d?[0-9]\d\/[1-2]\d{3})|(.*[a-zA-ZÇÃçã]+)|(\d+)|(\d{0,5}-?\d{0,4})|(.+)

4 respostas
solução!

Olá, Diego!! Tudo bem? =)

Uma das coisas interessantes com RegEx é que é possível um match possível de várias maneiras. A forma como você propõe tem algumas pequenas diferenças com relação ao original... O exercício pede para, recebendo

Nome|DataDeNasicmento|Rua|Número|CEP|Cidade,

devemos capturarmos nome, rua, número e CEP.

O que a sua RegEx está fazendo é:

  • ([a-zA-Z].+): Captura um grupo com caracteres de "a" a "z", tanto maiúsculas quanto minúsculas, seguidas de uma quantidade qualquer de quaisquer caracteres.

Obs: Para pegar uma quantidade de letras ,ou seja, uma palavra, você pode usar o \w.

  • ([0-3]\d\/\d?[0-9]\d\/[1-2]\d{3}): Captura um grupo com:
    1. Os números de "0" a "3";
    2. Seguidos de um dígito qualquer;
    3. Seguido de uma barra;
    4. Seguida de um dígito qualquer opcional;
    5. Seguido de um número de "0" a "9";
    6. Seguido de mais um dígito qualquer;
    7. Seguido de uma barra;
    8. Seguida de um número que pode ser "0" ou "1";
    9. Seguido de três dígitos quaisquer.

Obs: Até a primeira barra estava tudo certo, mas talvez você tenha se confundido naquele dígito opcional. Além disso, quando você colocou [0-9], você poderia ter usado o \d mais uma vez. E no seu caso acho que você não está considerando datas anteriores ao ano 1000, correto?

  • (.*[a-zA-ZÇÃçã]+): Captura um grupo com uma quantidade qualquer de quaisquer caracteres, seguidos das letras, maiúsculas ou minúsculas, ou aquelas letras "especiais".

Obs: Só lembrando que você pode usar o \w no lugar de [A-Za-z], ou ainda [A-z].

  • (\d+): Captura um grupo com quantidade qualquer de dígitos... Me parece bem válido. =)

  • (\d{0,5}-?\d{0,4}): Captura um grupo com:

    1. Quaisquer dígitos, podendo ter de 0 até 5 ocorrências;
    2. Seguidos de um hífen opcional;
    3. Seguido de dígitos quaisquer, de 0 a 4 ocorrências.

Obs: A sacada do hífen ser opcional ou não foi muito boa! Só toma um cuidado com a quantidade de dígitos... CEP são 5, seguidos de 3, então o ideal seria falar que a quantidade de caracteres é fixa em 5 e depois 3, ao invés de dar esses intervalos.

  • (.+): Captura um grupo com quaisquer caracteres com no mínimo uma ocorrência.

Obs: Cuidado que talvez não sejam todos os caracteres que são válidos, talvez apenas letras...?.

Ahh, e toma muito cuidado com esses pipes (|) no seu código. Se você os coloca da forma como fez, você está dando opções, ou seja, pode ser uma coisa ou outra, ou outra e assim por diante, sacou? Se você quiser dizer que o pipe deve estar presente, você deve escapá-lo com\|.

No geral está quase tudo certinho. Você chegou bem perto da resposta! =)

Só tomaria cuidado com uma ou outra coisinha que pode pegar aí no meio.

  1. Nem todos os grupos devem ser capturados, como é o caso da data de nascimento e da cidade;

  2. Algumas classes podem ser bem vindas. Inclusive, houve momentos em que você usou classes, às vezes intervalos... Quando for falar de palavras que só contém letras, pode usar o \w, quando for números, \d, quando for espaços, \s...

Da forma como você fez eu teria feito algo como:

([\w\s]+)\|(?:[0-3]\d\/[0-1]\d\/[1-2]\d{3})\|([\w\u00C0-\u017E]+)\|(\d+)\|(\d{5}\-?\d{3})(?:[\w\s]+)

Ahh, depois vale uma olhada na Tabela de caracteres unicode, para pegar esses caracteres com acentos.

Espero ter ajudado! =)

Fábio

Olá Fábio! obrigado pela dedicação no esclarecimento da minha dúvida, com certeza vou me atentar as suas sugestões. Obrigado mesmo!

Olá Diego,

Sem problemas! Você ainda possui mais alguma dúvida? Espero que tenha conseguido ajudá-lo nesse tópico. =)

Qualquer dúvida, não deixe de perguntar!! =)

Abraços e bons estudos, Fábio

Estava fazendo o curso e lembrei da aula sobre negação. Reparei que existe uma outra opção, então achei que poderia registrar aqui. Como o caractere | (pipe) é usado como separador, ele nunca vai existir no texto que vamos capturar. Já que sabemos qual a posição de cada informação, isso permite que a gente gere uma regex curiosa, (pulando a validação):

^([^|]+)\|(?:[^\]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|(?:[^|]+)$

Dividindo ela, temos 7 grupos, sendo 2 não capturáveis, mas todos com o mesmo conteúdo e separados por um pipe (\|).

([^|]+)
(?:[^\]+)

Removendo os grupos, fica assim:

[^|]+

A negação do pipe engloba todos os caracteres até o próximo pipe! Assim, podemos criar grupos de "tudo o que não é pipe" entre os pipes, pulando a validação e capturando o conteúdo na ordem adequada.

Então a gente captura os grupos 1, 3, 4, 5 e 6 e não captura os grupos 2 e 7, o que nos retorna o resultado correto também! =)