要使用正则表达式执行此操作,您必须确保整个 IPv4 点式四边形表示一个 32 位数字,其中只有前导数字。确保四边形中的每个数字只有前导数是不够的。例如,255.192.255.0 不是有效的子掩码,即使四边形中的每个数字只有前导数字。基于@xanatos 提供的解决方案,
var leadingOnes = new Regex("255|254|252|248|240|224|192|128|0+");
定义一个正则表达式,它将匹配任何 8 位(十进制)数字和前导数字。我使用“0+”来允许 .000,有时在四边形中使用。显然,如果您想强制一个零,请改用“0”。
然后您必须构建一个匹配以下四种模式中的任何一种的正则表达式,我将其表示为伪正则表达式以使其更易于理解:
- 255.255.255.领先的
- 255.255.leadingOnes*.0
- 255.leadingOnes.0.0
-
领先的.0.0.0
您可以将其写为单个字符串,也可以通过串联构建它。这是构建它:
var leadingOnes = "(255|254|252|248|240|224|192|128|0+);"
var allOnes = @"(255\.)";
var re = new Regex("^((" + allOnes + "{3}" + leadingOnes + ")|" +
"(" + allOnes + "{2}" + leadingOnes + @"\.0+)|" +
"(" + allOnes + leadingOnes + @"(\.0+){2})|" +
"(" + leadingOnes + @"(\.0+){3}))$");
如果我们忽略换行符,这是整个字符串。
var re = new Regex(@"^(((255\.){3}(255|254|252|248|240|224|192|128|0+))|((255\.){2}(255|254|252|248|240|224|192|128|0+)\.0)|((255\.)(255|254|252|248|240|224|192|128|0+)(\.0+){2})|((255|254|252|248|240|224|192|128|0+)(\.0+){3}))$");
按照@Keith 的建议,您可以从一个简单的正则表达式开始,例如
Regex("([0-9]{1,3}\.){3}[0-9]{1,3}" 得到四个由点分隔的 3 位数字,然后编写一个函数,将这四个部分提取并计算为一个 32 位整数,然后检查以确保它只有前导数。 有几种方法可以做到这一点,但它们都需要多达 31 次比较操作才能完成验证。