格式目标:需要a. b.c. d/x,其中〉〉
- a是1-3位数字,编号为1-223
- B、c和d是1-3位数字,必须为0-255和 *
- x是8-32之间的1或2位数字,(/x)组是可选的
以下是我现在拥有的完整正则表达式:
^(((?:22[0-3]|2([0-1])?\d?|([1-9][0-9]?|1[0-9]{2}))\.)((?:25[0-5]|2[0-4]\d|[01]?(\d{0,2}))\.){2}((25[0-5]|2[0-4]\d|[01]?(\d{0,2}))(\/([89]|[12]\d|3[0-2]))?),?\s?){1,50}$
我遇到的问题是:如果输入了“1.1.1.”(也就是没有“d”组),则它通过验证。我希望它在没有“d”组的情况下失败
下面是这个怪物被分成了几组,并为我自己的理智/可读性增加了空间://开始字符串,完整组
^(
//一个组,1-223用“”表示。
((?:22[0-3]|2([0-1])?\d?|([1-9][0-9]?|1[0-9]{2}))\.)
// B和c组0-255中的所有字符都用“”表示。
((?:25[0-5]|2[0-4]\d|[01]?(\d{0,2}))\.){2}
// d组,以可选的网络掩码而不是“”结尾。//我尝试将此设置为非可选组以解决问题。
((25[0-5]|2[0-4]\d|[01]?(\d{0,2}))
//网络掩码
(\/([89]|[12]\d|3[0-2]))?)
//允许逗号分隔,之间可选空格,最多50个IP
,?\s?){1,50}$
(我现在意识到这个逗号是可选的,所以它们可以只用一个空格来分隔。也许我也可以防止这种情况)。
1条答案
按热度按时间uxhixvfz1#
如果格式化模式并添加模式内注解,则更容易看到正则表达式的作用。
以下是您的 * current regex demo *:
但是,此正则表达式不仅不精确,而且leads to catastrophic backtracking包含一些长的非匹配字符串。
你的网络掩码模式很好。看起来你在创建一个数字范围正则表达式时遇到了问题。你可以随时求助于在线实用程序,它可以为你生成这些模式,我写了一个并在SO here上分享。
因此,1-223范围的模式为
(?:[1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])
(您可以手动将其缩减为(?:[1-9]\d?|1\d{2}|2[01]\d|22[0-3])
),0-255范围的模式为(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
(缩减为(?:[1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])
)您可以看到,使用这些模式可以解决问题,并使模式具有CA抵抗力:
请参阅this regex demo。