paulo1205
(usa Ubuntu)
Enviado em 05/02/2018 - 01:16h
Use
backreferences para obrigar o segundo separador a ser igual ao primeiro. Veja o exemplo abaixo (usando também
raw strings, para diminuir a quantidade de barras invertidas).
R"(^(\d\d)([-./])(0[1-9]|1[0-2]|[[:alpha:]]{3})\2(\d{4,})$)"
// ^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^
// |||| ||||| |||||||||||||||||||||||||||| || ||||||
// |||| ||||| |||||||||||||||||||||||||||| || Grupo 4: quatro dígitos ou mais para o ano
// |||| ||||| |||||||||||||||||||||||||||| Backreference ao valor do grupo 2
// |||| ||||| Grupo 3: meses numéricos de "01" a "09" ou "10" a "12", ou com três letras
// |||| Grupo 2: separador ("-", "." ou "/")
// Grupo 1: dois dígitos para o dia
Possíveis alterações:
• Eu agrupei cada componente supondo que você possa querer validá-los individualmente após verificar a regex. Se você quiser apenas ver sua forma geral, pode remover o agrupamento dos grupos 1 e 4 (nesse caso, o separador será o novo grupo 1, e você terá de alterar a
backreference).
• Você pode querer levar a validação da regex um pouco mais a diante para os meses, fazendo no grupo 3 algo como “
(0[1-9]|1[0-2]|jan|fev|mar|abr|mai|jun|jul|ago|set|out|nov|dez)” (nesse caso, ao criar a regex, você provavelmente vai querer ligar a opção de ignorar a diferença entre maiúsculas e minúsculas).
• Semelhantemente, para o grupo dos dias, você poderia tentar “
(0[1-9]|[12]\d|3[01])”.
• Se você quiser dias ou meses de um dígito, pode incluir mais uma alternativa no grupo ou tornar o primeiro zero opcional (e.g., para o dia, “
(0?[1-9]|[12]\d|3[01])”).
• Considere usar
strptime() (POSIX) ou outra função, classe ou biblioteca já pronta de conversão, tal como
boost::date_time.