Java IPaddress/前缀的正则表达式
我有一个用于IP地址验证的正则表达式,但我需要一个用于前缀验证的正则表达式,其中预期的形式是“IP地址/前缀” 条件是:Java IPaddress/前缀的正则表达式,java,regex,ip-address,Java,Regex,Ip Address,我有一个用于IP地址验证的正则表达式,但我需要一个用于前缀验证的正则表达式,其中预期的形式是“IP地址/前缀” 条件是: 前缀值不应大于128 前缀值应可被4整除 有人能帮我创建一个用于前缀验证的正则表达式吗?如果你想验证IP地址子网前缀号,你可以使用蛮力创建一个正则表达式,包括4到128的倍数:/0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 |……| 120 | 124 | 128/ 您可以通过注意到如果4的倍数结束于两个数字偶数+{0,4,8}或奇数+{2,
有人能帮我创建一个用于前缀验证的正则表达式吗?如果你想验证IP地址子网前缀号,你可以使用蛮力创建一个正则表达式,包括4到128的倍数:
/0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 |……| 120 | 124 | 128/
您可以通过注意到如果4的倍数结束于两个数字偶数+{0,4,8}或奇数+{2,6}来稍微简化这一点
除了这种蛮力方法,没有办法干净、紧凑地实现您想要的内容-正则表达式只处理单个字符,不处理数字的语义解释(因此没有比较,没有算术)。如果您想验证IP地址子网前缀号,你可以用蛮力构建一个正则表达式,包括4到128的倍数:
/0 | 4 | 8 | 12 | 16 | 24 | 28 | 32 | | 120 | 124 | 128/
您可以通过注意到如果4的倍数结束于两个数字偶数+{0,4,8}或奇数+{2,6}来稍微简化这一点
除了这种蛮力方法,没有办法干净、紧凑地实现您想要的内容-正则表达式处理单个字符,而不是数字的语义解释(因此没有比较,没有算术)。AFAIK您不能使用正则表达式进行计算(例如,数字%4==0?)。因此,您必须使用一种模式来获取所有可能的字符串组合 试试那个:
\b[048]\b |\b[13579][26]\b |\b[2468][048]\b |\b1[02][048]\b |\b11[26]\b
匹配0、4和8\b[048]\b
匹配12、16、32、26等\b[13579][26]\b
匹配20、24、28、40、44、48等\b[2468][048]\b
匹配100、104、108、120、124、128\b1[02][048]\b
匹配112和116\b11[26]\b
\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
。如果然后调用匹配(…)
则没有\b
就可以了
匹配(…)
调用的模式(无\b
,允许前导零):0{0,2}[048]|0?[13579][26]|0?[2468][048]| 1[02][048]| 11[26]
如果您不能使用正则表达式进行计算(例如,数字%4==0?)。因此,您必须使用一种模式来获取所有可能的字符串组合
试试那个:\b[048]\b |\b[13579][26]\b |\b[2468][048]\b |\b1[02][048]\b |\b11[26]\b
匹配0、4和8\b[048]\b
匹配12、16、32、26等\b[13579][26]\b
匹配20、24、28、40、44、48等\b[2468][048]\b
匹配100、104、108、120、124、128\b1[02][048]\b
匹配112和116\b11[26]\b
\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
。如果然后调用匹配(…)
则没有\b
就可以了
匹配(…)
调用的模式(无\b
,允许前导零):0{0,2}[048]|0?[13579][26]|0?[2468][048]|1[02][048]| 11[26]
除了使用正则表达式之外,您还可以执行以下操作:
int prefix = Integer.parseInt(ipAddress.split(".")[0]);
if ( (prefix <= 128) && (prefix % 4 == 0)) {
//success
}
else {
//failure
}
int prefix=Integer.parseInt(ipAddress.split(“.”[0]);
如果((前缀而不是使用正则表达式,您还可以执行以下操作:
int prefix = Integer.parseInt(ipAddress.split(".")[0]);
if ( (prefix <= 128) && (prefix % 4 == 0)) {
//success
}
else {
//failure
}
int prefix=Integer.parseInt(ipAddress.split(“.”[0]);
如果((前缀)你能给出一个示例IP地址和前缀值是什么样的吗?所有的数字都可以被4整除。你是说“可以均匀整除”吗?马克B:从数论来看,“可以整除”这个词总是指“可以均匀整除”.regexp是这个工作的错误工具。你真的需要一个regexp解决方案吗?或者你只是猜测你需要吗?你能给出一个示例IP地址和前缀值是什么样的吗?所有数字都可以被4整除。你的意思是“可均匀整除”?Marc B:从数论来看,“可整除”一词总是意味着“可均匀整除”.regexp是此作业的错误工具。您真的需要一个regexp解决方案,还是只是猜测需要?不,136不匹配[13579][26]
@aioobe这取决于它的调用方式。136不会作为一个整体匹配,但其中的36部分可能会匹配。对,只要你坚持使用字符串.maches
或匹配器.Matcher
并避免匹配器.find
等,你应该会很好。或者你可以用^…$
替换所有\b
,我支持ose。此答案的编辑和注释正是您不想使用正则表达式解决此问题的原因。很难正确理解它是否正确。不,136不匹配[13579][26]
@aioobe这取决于它的调用方式。136不能作为一个整体匹配,但其中的36部分可能匹配。对,只要你坚持使用字符串。马赫数
或<