我有一个正则表达式可以检查一个字符串是否包含有效的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
Nothing:(
用于测试的测试脚本:
#!/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
3条答案
按热度按时间2j4z5cfb1#
成功的最短路径是GNU grep,它也支持PCRE:
grep的
-q
使其静默,并依赖于退出代码来确定成功。但是我应该指出,你的正则表达式并不完全匹配某个东西是一个有效的CIDR范围;相反,您匹配的是一个有效的IP地址,后跟一个斜杠和一个数字 n ∈ 1-32。CIDR范围的另一个要求是地址的 32-n 低位为零,例如:
用
127.0.0.0/24
、127.1.0.0
、127.1.1.0/24
等测试。或更多奇数范围:
10.10.10.8/29
、127.0.0.0/8
、127.3.0.0/10
、192.168.248.0/21
。xurqigkl2#
Simon的解决方案很优雅。:)
我不太喜欢复杂的正则表达式来验证那些应该用其他方式解释的有意义的东西,所以,如果你更喜欢用字符串操作而不是数学来做这件事,我写了下面的函数:
此函数以二进制形式组装IP地址,如果在IP地址的主机部分设置了任何“1”,则会失败。
fykwrbwg3#
对不起,我只是第一次开始编写脚本,想了解一切。这当然不是最优雅和最短的方式,但作为一个网络家伙,我理解每一步,我能够在每一步启用调试。