我有一个用于IP地址验证的正则表达式,但我需要一个正则表达式用于前缀验证,其中预期的表单是“IP地址/前缀”。
条件是:
前缀值不应大于128
前缀值应该可被4整除。
有人可以帮我创建前缀验证的正则表达式吗?
答案 0 :(得分:2)
您也可以这样做,而不是使用正则表达式:
int prefix = Integer.parseInt(ipAddress.split(".")[0]);
if ( (prefix <= 128) && (prefix % 4 == 0)) {
//success
}
else {
//failure
}
答案 1 :(得分:1)
如果要验证IP地址子网前缀号,可以通过包含4到128的倍数来强制构建正则表达式:/0|4|8|12|16|20|24|28|32|...|120|124|128/
您可以稍微简化一下,注意如果4的倍数在两位数中结束,则偶数+ {0,4,8}或奇数+ {2,6}。
除了这种暴力方法之外,没有办法干净利落地实现你想要的东西 - 正则表达式对单个字符起作用,而不是对数字的语义解释(所以没有比较,没有算术)。
答案 2 :(得分:1)
AFAIK您无法使用正则表达式进行计算(例如,数字%4 == 0?)。因此,您必须使用一种模式来获取所有可能的字符串组合。
尝试一下:\b[048]\b|\b[13579][26]\b|\b[2468][048]\b|\b1[02][048]\b|\b11[26]\b
\b[048]\b
匹配0,4和8 \b[13579][26]\b
匹配12,16,32,26等。\b[2468][048]\b
匹配20,24,28,40,44,48等。\b1[02][048]\b
匹配100,104,108,120,124,128 \b11[26]\b
匹配112和116 注意定义整个单词的\b
(在您的情况下是前缀/后缀)必须与模式匹配。没有它,136可能匹配[13579][26]
,例如。
修改:允许前导零将模式更改为:\b0{0,2}[048]\b|\b0?[13579][26]\b|\b0?[2468][048]\b|\b1[02][048]\b|\b11[26]\b
(请注意,0{0,2}
也可以写为0?0?
)。
编辑2:如果拆分IP地址并且只有一个包含前缀/后缀的字符串,则可能会删除\b
。如果您随后致电matches(...)
,那么您应该没有\b
。
matches(...)
来电的模式(无\b
,允许前导零):
0{0,2}[048]|0?[13579][26]|0?[2468][048]|1[02][048]|11[26]