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

时间:2013-05-23 13:55:34

标签: 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.-

这些不是:

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 个答案:

答案 0 :(得分:9)

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

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

RegexBuddy Screenshot

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可以很方便