【发布时间】:2013-05-18 22:12:16
【问题描述】:
我尝试编写一个表达式来验证以下模式:
数字[0-9] 恰好是 1 次
“点”
数字[0-9] 1-2次
“点”
数字[0-9] 1-3次
“点”
digit[0-9] 1-3 次或“连字符”
例如,这些是合法的数字:
1.10.23.5
1.10.23.-
这些不是:
10.10.23.5
1.254.25.3
我使用 RegexBuddy 编写了下一个模式:
[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-
在 RegexBuddy 中,一切似乎都很完美,但在我的代码中,我对非法数字(如 10.1.1.1)越来越了解
我写了下一个验证这个模式的方法:
public static bool IsVaildEc(string ec)
{
try
{
if (String.IsNullOrEmpty(ec))
return false;
string pattern = @"[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-";
Regex check = new Regex(pattern);
return check.IsMatch(ec);
}
catch (Exception ex)
{
//logger
}
}
我做错了什么?
【问题讨论】:
-
@AnnArbor87:根据MSDN,
.是正则表达式中任何单个字符的通配符。 OP 想要一个点,.,因此他或她必须用 ``. 转义它 -
@AnnArbor87:
?表示 preceding 子表达式可能出现零次或一次。即.=> 任何字符;.?=> 任何字符或根本没有字符。 -
@KendallFrey:不在 .NET 中!该正则表达式也将匹配
².³.۴.-,因为\d支持 Unicode。 -
@Ofir:一些评估正则表达式的方法或工具隐含地假设正则表达式是为了匹配整个输入字符串(显然 RegexBuddy 属于这个组),而其他的(你的 .NET API正在使用)不要。
-
@Kendall - 从MSDN documentation: "
\d... 等价于\p{Nd}正则表达式模式,其中包括标准十进制数字0-9 以及许多其他字符集的十进制数字。"