【问题标题】:Why isn't this C# regular expression working?为什么这个 C# 正则表达式不起作用?
【发布时间】:2013-05-18 22:12:16
【问题描述】:

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

数字[0-9] 恰好是 1 次
“点”
数字[0-9] 1-2次
“点”
数字[0-9] 1-3次
“点”
digit[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
            }
        }

我做错了什么?

【问题讨论】:

  • @AnnArbor87:根据MSDN. 是正则表达式中任何单个字符的通配符。 OP 想要一个点,.,因此他或她必须用 ``. 转义它
  • @AnnArbor87: ? 表示 preceding 子表达式可能出现零次或一次。即. => 任何字符; .? => 任何字符或根本没有字符。
  • @KendallFrey:不在 .NET 中!该正则表达式也将匹配 ².³.۴.-,因为 \d 支持 Unicode。
  • @Ofir:一些评估正则表达式的方法或工具隐含地假设正则表达式是为了匹配整个输入字符串(显然 RegexBuddy 属于这个组),而其他的(你的 .NET API正在使用)不要。
  • @Kendall - 从MSDN documentation: "\d ... 等价于\p{Nd} 正则表达式模式,其中包括标准十进制数字0-9 以及许多其他字符集的十进制数字。"

标签: c# regex c#-4.0


【解决方案1】:

您的正则表达式没有锚定到字符串的开头和结尾,因此它也匹配子字符串(例如字符串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}|-)$";

【讨论】:

    【解决方案2】:

    尝试:

    @"^[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】:

    如果您匹配“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}\.-"
    

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

    【讨论】:

    • 这也会在 123.1.1.- 上返回 True,这是不应该的。
    【解决方案4】:

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

    试试这个正则表达式:

    ^[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-12-05
    • 1970-01-01
    • 2010-10-21
    相关资源
    最近更新 更多