Java IPaddress/前缀的正则表达式

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地址验证的正则表达式,但我需要一个用于前缀验证的正则表达式,其中预期的形式是“IP地址/前缀”

条件是:

  • 前缀值不应大于128

  • 前缀值应可被4整除


  • 有人能帮我创建一个用于前缀验证的正则表达式吗?

    如果你想验证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

    • \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
    。如果然后调用
    匹配(…)
    则没有
    \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

    • \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
    。如果然后调用
    匹配(…)
    则没有
    \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部分可能匹配。对,只要你坚持使用
    字符串。马赫数
    或<