4

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

digit[0-9] 1 次恰好是
"dot"
digit[0-9] 1-2 次
"dot"
digit[0-9] 1-3 次
"dot"
digit[0-9] 1-3 次或“连字符”</p>

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

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
            }
        }

我究竟做错了什么?

4

4 回答 4

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}|-)$";
于 2013-05-23T14:00:30.093 回答
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}\.-"

你不是从正文开始

于 2013-05-23T13:59:57.190 回答
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}\.-"

^符号开头表示您要从头开始匹配。

于 2013-05-23T14:04:23.007 回答
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很方便

于 2013-05-23T14:13:15.063 回答