I want to use regex
for checking only three allowed characters: "[0-9]
" and ".
" and "/
".
Note: The test case is an ipv4/ipv6
address but I don't want to check the number in the range [0-255]
, I only want to check allowed characters in the input variable.
I use "|
" as the "or
" expression, and combine all the three allowed characters with "|
", and finally add "+
" in the last for make sure at less one allowed character must exist in the input variable.
Here is the test bash script:
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"
Here is the output:
yes, 127.0.0.1/24 is allowed
yes, 127.0.0.1#24 is allowed
yes, ::1/128 is allowed
Here is the expected output:
yes, 127.0.0.1/24 is allowed
What's wrong in my regex? And how to fix?
Your regular expression seems almost correct, but it could use some slight adjustments:
.
character in regex has a special meaning (matching any character), so it needs to be escaped using\.
to match literal dots..
properly, but the key issue is how you're handling regex within bash. Bash treats regex differently than other languages, so double-check how it's applied.Now the modified script will look something like this:
And you will get an desired output like this: