IP正则表达式掩码在WPF中不起作用

时间:2015-09-01 10:22:50

标签: c# regex wpf textbox ip

我读过有关IP掩码的问题但尚未找到答案 我正在尝试使用正则表达式来验证IP,从而在wpf中编写文本框。这是我的xaml代码 这段代码正在运行

null

例如,我可以写192或255或29 之后我想添加一个点字符。这让我的代码崩溃了。所以我希望我能写 192.或255.或29。 我认为括号中的问题,但无法理解如何解决它。我的解决方案不正确:

<TextBox wpfApplication2:Masking.Mask="^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"/>

<TextBox wpfApplication2:Masking.Mask="^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]$"/>

我确定这个错误非常愚蠢,但无法找到它

更新 感谢@stribizhev,他给出了IP地址的解释和答案。 我的问题是:我应该在[。]之后使用{0,1}。所以我的问题的正确答案(如何为数字192或255或29创建掩码)是

<TextBox wpfApplication2:Masking.Mask="^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.])$"/>

2 个答案:

答案 0 :(得分:1)

如果您想接受任何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 + "$");

我认为更容易拆分&#34;重复&#34;匹配单个变量中的单个数字组。

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

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

但是错了,你应该使用这个

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

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

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

答案 1 :(得分:1)

以下是可用于实时验证的正则表达式(不适用于最终):

^(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])?){0,3}$

请参阅demo

为实时验证编写正则表达式时的要点是使部件可选。可以使用*?{0,x}量词来完成。这是一个正则表达式的细分:

  • ^ - 字符串开头
  • (?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]) - 这是第一个号码,这是强制性的,但如果您打算让值为空,请在末尾添加?
  • (?:\.(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])?){0,3} - 一系列0到3次出现....
    • \. - 一个文字点(在逐字字符串文字中,@"..."
    • (?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])? - 允许的数字序列,1或0出现(最后有?
  • $ - 字符串结尾

对于最终验证,请使用

^(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}$

请参阅another demo

此正则表达式检查整个最终IP字符串。