为什么这个C#正则表达式不起作用?

Ofi*_*fir 4 c# regex c#-4.0

我试着写一个表达式来验证以下模式:

数字[0-9] 1次正好
"点"
数字[0-9] 1-2次
"点"
数字[0-9] 1-3次
"点"
数字[0-9] 1-3次或"连字符"

例如,这些是合法的数字:

1.10.23.5
1.10.23.-
Run Code Online (Sandbox Code Playgroud)

这些不是:

10.10.23.5
1.254.25.3
Run Code Online (Sandbox Code Playgroud)

我使用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}\.-
Run Code Online (Sandbox Code Playgroud)

在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
            }
        }
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Tim*_*ker 9

你的正则表达式没有锚定到字符串的开头和结尾,因此它也匹配一个子字符串(例如0.1.1.1在字符串中10.1.1.1).

如您所见,RegexBuddy匹配第一个"非法"数字中的子字符串.它正确地无法匹配第二个数字,因为第二个八位字节中的三个数字根本无法匹配:

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}\.-)$";
Run Code Online (Sandbox Code Playgroud)

将解决这个问题.

然后,你的正则表达式是不必要的复杂.以下内容相同但更简单:

string pattern = @"^[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.(?:[0-9]{1,3}|-)$";
Run Code Online (Sandbox Code Playgroud)