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}$");
这是您可以用于实时验证的正则表达式(不适用于最终):
^(?:[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}$
此正则表达式检查整个最终 IP 字符串。
我阅读了有关 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}$");
这是您可以用于实时验证的正则表达式(不适用于最终):
^(?:[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}$
此正则表达式检查整个最终 IP 字符串。