这比一个真正的答案注释,但...
# _your_ regex:
sh$ [[ 923.34442.123 =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]] && echo ok || echo notok
ok
# regex using backslash:
sh$ [[ 23.34442.123 =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] && echo ok || echo notok
notok
由于这已经说明,关键的一点是采用了反斜线(\
)的。单独的点(.
)将匹配任何单个字符。 [0-9]{1,3}
部分的含义是“匹配1到3位的任何序列”。
因此,从广义上讲,你正则表达式将匹配具有1至3通过分离任何字符位数4个序列的任意字符串:
9 2 3 . 3 4 4 4 2 . 1 2 3
d d d a d d d a d a d d d
i i i n i i i n i n i i i
g g g y g g g y g y g g g
i i i c i i i c i c i i i
t t t h t t t h t h t t t
a a a
r r r
这可能是在第一个令人吃惊,但是它匹配。 ..
作为一个侧面说明,即使是“反斜线点正则表达式”将接受非有效的IPv4地址:例如923.34.42.123
将匹配,但显然是不正确。为了好玩,这里有一个基于awk
的过滤器(及其测试集),用于从列表中删除无效的IPv4地址。随意适应您的需求(或完全忽略它;)
sh$ BYTE='[0-2]?[0-9]?[0-9]' # Might even be BYTE='0*[0-2]?[0-9]?[0-9]'
sh$ cat << EOF | awk -v FS='.' "/^$BYTE\.$BYTE\.$BYTE\.$BYTE$/"' {
if (($1<= 255)&&($2<=255)&&($3<=255)&&($4<=255))
print $0 }'
4.2.2.2
a.b.c.d
192.168.1.1
0.0.0.0
255.255.255.255
255.255.255.256
192.168.0.1
192.168.0
1234.123.123.123
EOF
这里是结果:
4.2.2.2
192.168.1.1
0.0.0.0
255.255.255.255
192.168.0.1
也许你只是想“\”。 - 意思是点而不是“。” - 意思是任何角色? – cerkiewny
'[。]'不''(反斜杠转义有时也可以,但是在多层解析中更容易丢失)。 –