【问题标题】:IP regex mask not working in WPFIP 正则表达式掩码在 WPF 中不起作用
【发布时间】:2015-09-01 10:22:50
【问题描述】:

我阅读了有关 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}$"/>

【问题讨论】:

标签: c# regex wpf textbox ip


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    我认为将一组数字的“重复”匹配拆分为单独的变量更容易。

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-17
      • 2019-04-12
      • 2021-10-26
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      相关资源
      最近更新 更多