Quero usar regex
para verificação apenas três caracteres permitidos: " [0-9]
" e " .
" e " /
".
Observação : o caso de teste é um ipv4/ipv6
endereço, mas não quero verificar o número no intervalo [0-255]
, quero apenas verificar os caracteres permitidos na variável de entrada.
Eu uso " |
" como a or
expressão " " e combino todos os três caracteres permitidos com " |
" e, finalmente, adiciono " +
" no último para garantir que pelo menos um caractere permitido exista na variável de entrada.
Aqui está o script de teste bash:
test_ipv4_address="127.0.0.1/24"
test_wrong_ipv4_address="127.0.0.1#24"
test_ipv6_address="::1/128"
allowed_characters='([0-9]|\.|\/)+'
[[ "$test_ipv4_address" =~ $allowed_characters ]] && echo "yes, $test_ipv4_address is allowed"
[[ "$test_wrong_ipv4_address" =~ $allowed_characters ]] && echo "yes, $test_wrong_ipv4_address is allowed"
[[ "$test_ipv6_address" =~ $allowed_characters ]] && echo "yes, $test_ipv6_address is allowed"
Aqui está a saída:
yes, 127.0.0.1/24 is allowed
yes, 127.0.0.1#24 is allowed
yes, ::1/128 is allowed
Aqui está a saída esperada:
yes, 127.0.0.1/24 is allowed
O que há de errado no meu regex? E como consertar?
Sua expressão regular parece quase correta, mas poderia usar alguns pequenos ajustes:
.
caractere em regex tem um significado especial (corresponde a qualquer caractere), então ele precisa ser escapado usando\.
para corresponder a pontos literais..
corretamente, mas a questão principal é como você está lidando com regex dentro do bash. O Bash trata regex de forma diferente de outras linguagens, então verifique novamente como ele é aplicado.Agora o script modificado ficará mais ou menos assim:
E você obterá uma saída desejada como esta: