为什么不是';这个C#正则表达式能工作吗?

为什么不是';这个C#正则表达式能工作吗?,c#,regex,c#-4.0,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}\.- 在

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

数字[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-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-"

您不是从文本的开头开始的您的正则表达式没有锚定到字符串的开头和结尾,因此它也匹配一个子字符串(例如字符串
10.1.1.1
中的
0.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}|-)$";
如果与“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}\.-"

开头带有
^
符号表示您希望从头开始匹配。

您缺少正则表达式开头的
^
字符

试试这个正则表达式:

^[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-

这很方便

@AnnArbor87:根据,
是正则表达式中任何单个字符的通配符。OP需要一个点,一个
,因此他或她必须用“``来转义它。@AnnArbor87:
表示前面的子表达式可能出现零次或一次。i、 e.
=>任何字符<代码>?=>任何字符或根本没有字符。@KendallFrey:不在.NET中!该正则表达式也将匹配
².³.۴。-
,因为
\d
支持Unicode。@Ofir:一些计算正则表达式的方法或工具隐式地假定正则表达式要匹配整个输入字符串(显然,RegexBuddy属于此组),而其他方法(您正在使用的.NET API)不要。@肯德尔-从“<代码> \d>代码>…相当于<代码> \p{Nd}\/Cord>正则表达式模式,其中包括标准十进制数字0~9以及其他字符集的十进制数字。“小心,锚定的范围是不正确的,因为在正则表达式中间没有变化。此外,您还缺少一个字符串结束锚。这也会在
123.1.1.-
上返回
True
,但它不应该返回该值。这与您之前的两个答案相同,并且包含与他们相同的错误。。。