【问题标题】:Regex for ESI Number [duplicate]ESI 编号的正则表达式 [重复]
【发布时间】:2020-06-02 03:17:26
【问题描述】:

我需要一个 C# 中的 regex 用于下面提到的数字

31–00–123456–000–0001

我在将 dash 放入正则表达式时遇到问题。号码验证非常好。

【问题讨论】:

  • 请提供更多信息。字符串还有其他限制吗?这些数字中的每一个都将始终是它们各自的长度吗?是否有任何值是静态的?你有一个开始的例子吗?
  • @"^[0-9]{2}–[0-9]{2}–[0-9]{6}–[0-9]{3}–[0-9]{4}$"?
  • 那个破折号是U+02013。这是您期望的唯一破折号,还是U+0002D 也可以接受?非常清楚你想要什么。并展示你的尝试。

标签: c# asp.net regex


【解决方案1】:

如果可以接受任何类型的dash(例如U+02013),我建议使用\p{Pd},这意味着任何unicode dashPunctuation d灰)。如果数字应该由任何破折号分隔,但是,它必须是整个字符串中的相同

Regex regex = new Regex(@"^[0-9]{2}(\p{Pd})[0-9]{2}\1[0-9]{6}\1[0-9]{3}\1[0-9]{4}$");

演示:

  string[] tests = new string[] {
    "31–00–123456–000–0001", // All Dashes
    "31-00-123456-000-0001", // All minuses
    "31–00-123456-000-0001", // Dash then minues
  };

  string report = string.Join(Environment.NewLine, tests
    .Select(test => $"{test,25} :: {(regex.IsMatch(test) ? "Matched" : "Failed")}"));

  Console.Write(report);

结果:

31–00–123456–000–0001 :: Matched
31-00-123456-000-0001 :: Matched
31–00-123456-000-0001 :: Failed

如果您想在同一字符串中容忍不同的破折号

Regex regex = new Regex(
  @"^[0-9]{2}\p{Pd}[0-9]{2}\p{Pd}[0-9]{6}\p{Pd}[0-9]{3}\p{Pd}[0-9]{4}$");

【讨论】:

    【解决方案2】:

    这是你需要的吗?

    (\d{2})[\–\-](\d{2})[\–\-](\d{6})[\–\-](\d{3})[\–\-](\d{4})
    

    因此,如果您已经将代码提取到字符串变量代码并想检查它是否匹配,那么请使用 ^ 和 $,如下所示:

    ^(\d{2})[\–\-](\d{2})[\–\-](\d{6})[\–\-](\d{3})[\–\-](\d{4})$
    

    根据cmets,最好使用[0-9]来减少其他类型的degets。

    ^([0-9]{2})[\–\-]([0-9]{2})[\–\-]([0-9]{6})[\–\-]([0-9]{3})[\–\-]([0-9]{4})$
    

    【讨论】:

    • 我建议添加锚点:^...$bla-bla-bla_valid_ESI_number_bla-bla-bla 将匹配。注意\d:在.net 中它表示任何Unicode 数字,所以۱۳–۱۳–۱۳۱۳۱۳–۱۳۱–۱۳۱۳波斯数字)会匹配——要么切换到[0-9],要么添加@ 987654329@
    • 感谢您的评论。我改变我的答案。
    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2011-09-04
    • 1970-01-01
    • 2018-06-04
    相关资源
    最近更新 更多