【发布时间】:2018-10-09 14:06:16
【问题描述】:
我似乎无法理解这一点。 我有一个正则表达式来检查字符串是否包含有效的 CIDR 表示法地址。
(((?:25[012345]|2[0-4]\d|1?\d\d?)\.){3}(?:25[012345]|2[0-4]\d|1?\d\d?))(?:\/([1-9]|[1-2][0-9]|3[0-2]))(?![.\d])
这个东西可以在 Perl、PHP、Javascript 中运行,并且匹配 x.x.x.x/8 到 y.y.y.y/32。
我尝试将那些 \d 更改为 [[:digit:]] 和 \\d 什么都没有:(
用于测试的测试脚本:
#!/bin/bash
if [ "$1" = "" ]
then
echo "Usage: $( basename $0) 123.456.789.0/12"
exit
fi
REGEX1='(((?:25[012345]|2[0-4]\d|1?\d\d?)\.){3}(?:25[012345]|2[0-4]\d|1?\d\d?))(?:\/([1-9]|[1-2][0-9]|3[0-2]))(?![.\d])'
REGEX2='(((?:25[012345]|2[0-4]\\d|1?\\d\\d?)\.){3}(?:25[012345]|2[0-4]\\d|1?\\d\\d?))(?:\\/([1-9]|[1-2][0-9]|3[0-2]))(?![.\\d])'
REGEX3='(((?:25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?)\\.){3}(?:25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?))(?:\\/([1-9]|[1-2][0-9]|3[0-2]))(?![.[[:digit:]]])'
REGEX=$REGEX3
if [[ $1 =~ $REGEX ]]
then
echo "$1 OK!"
else
echo "$1 Not OK! $REGEX"
fi
有什么想法可以从这里开始吗?
已更新。添加了工作脚本:
#!/bin/bash
if [ "$1" = "" ]
then
echo "Usage: $( basename $0) 123.456.789.0/12"
exit
fi
REGEX='(((25[0-5]|2[0-4][0-9]|1?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|1?[0-9][0-9]?))(\/([8-9]|[1-2][0-9]|3[0-2]))([^0-9.]|$)'
if [[ $1 =~ $REGEX ]]
then
echo "$1 OK!"
else
echo "$1 Not OK!"
fi
if echo $1 | grep -Pq $REGEX
then
echo "grep $1 OK!"
else
echo "grep $1 Not OK!"
fi
【问题讨论】:
-
=~使用扩展正则表达式,而不是与 Perl 兼容的正则表达式 (PCRE)。 -
如果你有 GNU grep,你也许可以使用带有
if echo $1|grep -Pq $REGEX的原始正则表达式。如果您需要使用 POSIX 正则表达式,则非捕获组不可用 ((?:...)),前瞻 ((?!...)) 也不可用。 -
您可以使用
(((25[0-5]|2[0-4][0-9]|1?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|1?[0-9][0-9]?))(\/([1-9]|[1-2][0-9]|3[0-2]))([^0-9.]|$) -
谢谢大家。 Matt Raines 解决方案适用于 grep。 Revo 的解决方案适用于
=~和 grep。
标签: regex bash validation cidr