Validação de strings usando a classe regex posix

0

Estou tentando criar validação para um campo de endereço em um arquivo

O arquivo é assim;

123 Strata Ln.
15 138th Ave
27 Hilltop Dr. Apt. 7
F52 Milk Ln.
156A Fantastic St.
56 sample Ln.

Estas são as condições:

Número - pelo menos um dígito, seguido por um número arbitrário de dígitos adicionais

Nome da rua - um número arbitrário de palavras (pelo menos uma) em cada início com uma letra maiúscula ou número, seguido por qualquer número de menor e letras maiúsculas, números ou pontos (.)

EDIT: Com estas condições, apenas as três primeiras linhas do arquivo são válidas

Aqui está o que eu tentei

'^[[:digit:]][[:digit:]]+ ([[:upper:]]|[[:digit:]])([[:alphabet:]]|[[:digit:]])+\.$'

mas parece que não funciona. Alguma ajuda?

    
por Duck Dodgers 16.06.2018 / 15:07

1 resposta

3

at least one digit, followed by an arbitrary number of additional digits

+ já é "um ou mais", portanto, [[:digit:]][[:digit:]]+ exigiria pelo menos dois. Então, [[:digit:]]+ .

words (at least one) each beginning with a capital letter or number, followed by any number of lower and upper case letters, numbers, or periods (.)

Um capital ou um número: [[:upper:][:digit:]] , não há necessidade de alternância ( | ) aqui, pois podemos usar as duas classes de caracteres dentro dos colchetes ao mesmo tempo.

[[:alphabet:]] não é uma classe de caracteres válida, mas há alpha e alnum (para letras ou números). Este último pode ser útil.

Uma única palavra: [[:upper:][:digit:]][[:alnum:].]*

Múltiplas palavras, com espaços em branco na frente de cada uma (que cuida do espaço em branco depois do número inicial também): ([[:blank:]]+[[:upper:][:digit:]][[:alnum:].]*)+

Como você deseja corresponder à linha completa, adicione ^ e $ às extremidades ou use grep -x . Você pode adicionar [[:blank:]]* ao final (antes de $ ) para permitir espaços em branco fáceis de serem deixados por acidente.

Isso imprimiria apenas as três primeiras linhas da sua entrada de amostra:

grep -E '^[[:digit:]]+([[:blank:]]+[[:upper:][:digit:]][[:alnum:].]*)+$' file

Há uma ferramenta on-line para jogar com regexes no link que você pode achar útil para testes. Note que o acima requer grep -E por causa do + (a alternativa é feia), mas eu não acho que o regex101 permita o uso básico simples de grep regexes.

    
por 16.06.2018 / 15:19