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 dash(Punctuation 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 编号的正则表达式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章