([a-zA-Z].+)|([0-3]\d\/\d?[0-9]\d\/[1-2]\d{3})|(.*[a-zA-ZÇÃçã]+)|(\d+)|(\d{0,5}-?\d{0,4})|(.+)
([a-zA-Z].+)|([0-3]\d\/\d?[0-9]\d\/[1-2]\d{3})|(.*[a-zA-ZÇÃçã]+)|(\d+)|(\d{0,5}-?\d{0,4})|(.+)
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: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:
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.
Nem todos os grupos devem ser capturados, como é o caso da data de nascimento e da cidade;
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! =)