我使用下面的脚本来验证IPV6地址,但是这个脚本也传递了无效的IP,如空字符串,名称等。
if [[ "$IPv6ADDR"=~"^:?([a-fA-F0-9]{1,4}(:|.)?){0,8}(:|::)?([a-fA-F0-9]{1,4}(:|.)?){0,8}$" ]]; then
echo "valid ipv6 addr"
else
echo "Invalid IP Address"
fi
有人可以确定正则表达式中的错误吗?
答案 0 :(得分:2)
它传递空字符串的原因是所有内容都是可选的或允许匹配0次:
^
- 匹配字符串的开头:?
- 可选冒号([a-fA-F0-9]{1,4}(:|.)?){0,8}
- 匹配0 - 8次(因此可选)(:|::)?
- 可选冒号或双冒号([a-fA-F0-9]{1,4}(:|.)?){0,8}
- 匹配0 - 8次(因此可选)$
- 匹配字符串结尾因此允许使用空白字符串,因为您的模式允许字符串与任何可选部分都不匹配。
查看定义IP 6规范的RFC 4291,section 2.2定义了三种表示地址的方法。这可能是最简单的,如果您需要匹配所有表单以单独定义它们并将单独的正则表达式组合在一起,如
^(regex_pattern1|regex_pattern2|regex_pattern3)$
其中pattern1,例如,(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}
,模式2和3是其他情况(模式1取自正则表达式食谱,第2版(O'Reilly,2012) )
或者,甚至更好(为了便于阅读),连续测试它们(伪代码如下),
if (matches pattern 1)
echo 'valid'
else if (matches pattern 2)
echo 'valid'
else if (matches pattern 3)
echo 'valid'
else
echo 'invalid'
另请参阅此question以获取更多信息。