我尝试编写表达式来验证以下模式:
数字[0-9]正好1次 “点”
数字[0-9] 1-2次
“点”
数字[0-9] 1-3次
“点”
数字[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
}
}
我做错了什么?
答案 0 :(得分:9)
你的正则表达式没有锚定到字符串的开头和结尾,因此它也匹配字符串0.1.1.1
中的子字符串(例如10.1.1.1
)。
如您所见,RegexBuddy匹配第一个“非法”数字中的子字符串。它正确地无法匹配第二个数字,因为第二个八位字节中的三个数字根本无法匹配:
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}\.-)$";
将解决这个问题。
然后,你的正则表达式是不必要的复杂。以下内容相同但更简单:
string pattern = @"^[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.(?:[0-9]{1,3}|-)$";
答案 1 :(得分:0)
尝试:
@"^[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-"
你不是从文本的开头
开始的答案 2 :(得分:0)
如果你匹配“10.1.1.1”,你的字符串的“0.1.1.1”部分将是一个正确的数字,因此返回true。
与
匹配@"^[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-"
在开头带有^
符号表示您想从头开始匹配。
答案 3 :(得分:0)
您在正则表达式的开头缺少^
字符。
试试这个正则表达式:
^[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-
此C# Regex Cheat Sheet可以很方便