ESI 编号的正则表达式 [重复]

Posted

技术标签:

【中文标题】ESI 编号的正则表达式 [重复]【英文标题】:Regex for ESI Number [duplicate] 【发布时间】: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 也可以接受?非常清楚你想要什么。并展示你的尝试。 【参考方案1】:

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

Regex regex = new Regex(@"^[0-9]2(\pPd)[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\pPd[0-9]2\pPd[0-9]6\pPd[0-9]3\pPd[0-9]4$");

【讨论】:

【参考方案2】:

这是你需要的吗?

(\d2)[\–\-](\d2)[\–\-](\d6)[\–\-](\d3)[\–\-](\d4)

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

^(\d2)[\–\-](\d2)[\–\-](\d6)[\–\-](\d3)[\–\-](\d4)$

根据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@ 感谢您的评论。我改变我的答案。

以上是关于ESI 编号的正则表达式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 (.*) .* 就是这2种写法,有啥却别?分别代表啥含义?

正则表达式:匹配单个数字重复n次

在Python中使用正则表达式解析具有重复模式的字符串?

复习总结正则表达式-下

营业执照编号 正则表达式

嵌套捕获组如何在正则表达式中编号?