Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用shell脚本验证IPV6地址_Regex_Bash_Shell - Fatal编程技术网

Regex 使用shell脚本验证IPV6地址

Regex 使用shell脚本验证IPV6地址,regex,bash,shell,Regex,Bash,Shell,我正在使用下面的脚本验证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

我正在使用下面的脚本验证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次:

  • ^
    -匹配字符串的开头
  • :?
    -可选冒号
  • ([a-fA-F0-9]{1,4}(:|.?){0,8}
    -匹配0-8次(因此可选)
  • (:|::)?
    -可选冒号或双冒号
  • ([a-fA-F0-9]{1,4}(:|.?){0,8}
    -匹配0-8次(因此可选)
  • $
    -匹配字符串的结尾
因此,允许空白字符串,因为您的模式允许字符串与任何可选部分都不匹配


看看定义IP6规范的RFC4291,它定义了三种表示地址的方法。如果您需要匹配所有表单以分别定义它们并将单独的正则表达式组合在一起,这可能是最简单的,如中所示

^(regex_pattern1|regex_pattern2|regex_pattern3)$
例如,其中模式1是
(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}
,模式2和3用于其他情况(模式1取自正则表达式烹饪书,第二版(O'Reilly,2012))

或者,更好的是(为了可读性),以串行方式测试它们(随后是伪代码)


有关更多信息,请参见此部分。

最基本的错误是,
=~
运算符的两侧都需要空格。您可能不想使用空格。感谢Mathew的宝贵输入。@user2145274,欢迎使用。如果你觉得答案很有帮助,请考虑接受。你没有义务这么做,但这会给作者和你自己一点声誉,并列出问题的答案。还要记住,你可以对自己的问题或任何其他问题给出特别有用的答案。
if (matches pattern 1)
    echo 'valid'
else if (matches pattern 2)
    echo 'valid'
else if (matches pattern 3)
    echo 'valid'
else
    echo 'invalid'