我只想用来regex
检查三个允许的字符:“ [0-9]
”和“ .
”和“ /
”。
注意:测试用例是一个ipv4/ipv6
地址,但我不想检查范围内的数字[0-255]
,我只想检查输入变量中允许的字符。
我使用“ |
”作为“ or
”表达式,并将所有三个允许的字符与“ |
”组合,最后+
在最后添加“ ”,以确保输入变量中至少存在一个允许的字符。
以下是测试 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"
输出如下:
yes, 127.0.0.1/24 is allowed
yes, 127.0.0.1#24 is allowed
yes, ::1/128 is allowed
预期输出如下:
yes, 127.0.0.1/24 is allowed
我的正则表达式有什么问题?如何修复?
您的正则表达式看起来几乎正确,但可能需要进行一些细微的调整:
.
具有特殊含义(匹配任何字符),因此需要使用它\.
来匹配文字点。.
正确转义了,但关键问题是您在 bash 中如何处理正则表达式。Bash 对待正则表达式的方式与其他语言不同,因此请仔细检查其应用方式。现在修改后的脚本将如下所示:
您将获得如下期望的输出: