【问题标题】:Grouping regular expressions in C#在 C# 中对正则表达式进行分组
【发布时间】:2015-08-09 05:35:15
【问题描述】:

我正在尝试在 C# 中验证日期。

我需要检查以下格式:

dd/mm/yy
dd/mmm/yyyy
dd-mm-yy

下面的表达式抛出异常:

@"^(*\d{2}+[-\])+([\w{3}]|[\d{2}])+(\d{2,4})$"

请指出表达式中的错误。

【问题讨论】:

  • 请指出表达式中的错误
  • 您的变量是DateTime 还是string?我会使用DateTime.TryParseExact 重载,它将string[] 作为格式而不是正则表达式。
  • 您还可以创建一个正则表达式数组以在验证时循环

标签: c# regex validation date


【解决方案1】:
^(\d{2})([\/-])(\w{3}|\d{2})\2(\d{2,4})$

猜你需要这个。

    `^(*`

       ^^

这个量词给出了错误,因为它没有什么可以量化的。

查看演示。

https://regex101.com/r/tS1hW2/2

【讨论】:

    【解决方案2】:

    回答您关于正则表达式的问题,有几个问题。

    • 关键是开头(* 的问题(vks 已经指出)
    • 另一个关键问题是在d{2}+ 中使用另一个错位的量词+
    • 还有一个问题是您已将替代项放入字符类中。 ([\w{3}]|[\d{2}])+ 表示“从 2 个选项中选择:1) \w, {, 3, 或 }, 2) \d, {, 2}, 1 或更多发生”。

    因此,您的 .NET 正则表达式风格的正则表达式将如下所示:

    ^(\p{N}{2})([/-])(\p{L}{3}|\p{N}{2})\2(\p{N}{2,4})$
    

    demo on RegexStorm that supports .NET regex

    更通用的版本是^([0-9]{2})([/-])([a-zA-Z]{3}|[0-9]{2})\2([0-9]{2,4})$

    然而,如果你想验证写成字符串的DateTime值,你需要DateTime.TryParseExact它们。这是一个满足您要求的示例:

    var fmts = new[] { "dd/MM/yy", "dd/MMM/yyyy", "dd-MM-yy"}; // Allowed formats
    DateTime dt;
    var valid1 = DateTime.TryParseExact("13/02/15", fmts, new System.Globalization.CultureInfo("en-us"), System.Globalization.DateTimeStyles.None, out dt);
    // true
    var valid2 = DateTime.TryParseExact("10/Apr/2012", fmts, new System.Globalization.CultureInfo("en-us"), System.Globalization.DateTimeStyles.None, out dt);
    // true
    var valid3 = DateTime.TryParseExact("23-02-10", fmts, new System.Globalization.CultureInfo("en-us"), System.Globalization.DateTimeStyles.None, out dt);
    // true
    var valid4 = DateTime.TryParseExact("01-30-15", fmts, new System.Globalization.CultureInfo("en-us"), System.Globalization.DateTimeStyles.None, out dt);
    // false
    

    【讨论】:

    • 如果您觉得这个答案有用,也请考虑投票(左侧的向上箭头)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2012-02-21
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多