子网掩码的正则表达式?

Paw*_*anS 7 c# asp.net

我正在使用正则表达式来检查子网掩码.我使用带有屏蔽值的ajax txtbox,但这不起作用,然后我切换到文本框并为其应用正则表达式.不幸的是,一个人也没有工作.

你能帮助我为子网屏蔽255.255.255.255提供RE吗?

或者最好的方法呢?

方案:

我使用蒙面文本框,不知道如何放置验证表达式.

最后,我发现了一个蒙版文本框的属性作为验证表达式,然后我把RE和属性validate更改为true.

无需显式使用验证器表达式.

谢谢

Joe*_*Lee 11

要使用正则表达式执行此操作,必须确保整个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.leadingOnes
  • 255.255.leadingOnes*.0
  • 255. leadingOnes .0.0
  • leadingOnes .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}))$");
Run Code Online (Sandbox Code Playgroud)

如果我们忽略换行符,这就是整个字符串.

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个比较操作才能完成验证.

  • 您可以轻松地检查int是否只包含带有一些位算术和单个比较​​的前导:`i == i | (i << 1)` (2认同)

xan*_*tos 8

如果要接受任何IP地址作为子网掩码:

var num = @"(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})";
var rx = new Regex("^" + num + @"\." + num + @"\." + num + @"\." + num + "$");
Run Code Online (Sandbox Code Playgroud)

我认为更容易在单独的变量中拆分单个数字组的"重复"匹配.

作为读者的练习,我将给出表达式的另一种变体.这个将捕获同一组中的所有数字,但不同的捕获:

var rx = new Regex("^(?:" + num + @"(?:\.(?!$)|$)){4}$");
Run Code Online (Sandbox Code Playgroud)

但是这是错的,你应该使用它

var num = @"(255|254|252|248|240|224|192|128|0+)";
var rx = new Regex("^" + num + @"\." + num + @"\." +num + @"\." +num + "$");
Run Code Online (Sandbox Code Playgroud)

要么

var rx = new Regex("^(?:" + num + @"(?:\.(?!$)|$)){4}$");
Run Code Online (Sandbox Code Playgroud)

http://www.freesoft.org/CIE/Course/Subnet/6.htm