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

IP regex mask not working in WPF

我阅读了有关 IP 掩码的问题,但没有找到答案 我正在尝试使用正则表达式在 wpf 中编写一个文本框来验证 IP。这是我的 xaml 代码 此代码有效

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

比如我可以写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])(\.){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 + "$");

我认为将 "repeating" 匹配拆分为单独变量中的一组数字更容易。

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

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

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

^(?:[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 字符串。