gpt4 book ai didi

c# - 我的正则表达式可以改进吗?

转载 作者:太空狗 更新时间:2023-10-30 00:30:30 24 4
gpt4 key购买 nike

是的,另一个正则表达式问题。不客气;-P

这是我第一次为 C# 中的一些简单字符串验证编写自己的正则表达式。我想我已经让它工作了,但作为一个学习练习,我想知道它是否可以改进以及我是否犯了任何错误。

字符串看起来都像这样:

T20160307.0001

规则:

  • 以字母 T 开头。
  • 日期格式为 YYYYMMDD。
  • 句号。
  • 最后 4 个字符始终是数字。应该正好有 4 个。

这是我的正则表达式(fiddle):

^(?i)[T]20[0-9]{2}[0-1][0-9][0-3][0-9].\d{4}$

  • ^ 断言字符串的开头。
  • (?i)[T] 检查我们是否有字母 T,不区分大小写。
  • 20 YYYY 以 20 开头(我将在 2100 年死去,所以我不关心任何进一步的事情 :-P)
  • [0-9]{2} YYYY 的第二部分是 0 到 99 之间的任何数字。
  • [0-1][0-9] 0 或 1 表示第一个月,0-9 表示第二个月。
  • [0-3][0-9] 一天的第一部分为 0-3,一天的第二部分为 0-9。
  • 句号。
  • \d{4} 4 个数字字符。
  • $ 断言字符串结束。

我已经看到的一个陷阱是日期验证。 20161935(19月35日)视为有效。我读过 some/other/posts关于实现这一目标,我相信它在数字范围内匹配,但我无法理解格式。

如果有人对 ELI5 的工作原理足够友善,我会接受一个简单地解决日期问题的答案,但其他改进将是一个受欢迎的奖励。

编辑:为避免进一步混淆,我应该声明我知道 DateTime.TryParse 等。如前所述,我将此作为学习 Regex 的机会,并认为这是一个很好的起点。对那些浪费我时间的人表示抱歉,我应该在原帖中说明这一点。

最佳答案

您可以做的事情是:

  • 避免匹配所有 unicode 数字的 \d 字符类(因为您只需要 ascii 数字)
  • 你可以写 [01] 而不是 [0-1]
  • 将点转义为文字点(而不是任何字符)
  • 如果 T 是唯一的字符,则无需将其放入字符类中
  • 最终您可以删除内联修饰符并使用 [Tt] 代替 T


^(?i)T20[0-9]{2}[01][0-9][0-3][0-9]\.[0-9]{4}$

^[Tt]20[0-9]{2}[01][0-9][0-3][0-9]\.[0-9]{4}$

其他:您真的需要添加额外的日期检查,因为您无法真正测试日期格式是否正确吗? (想一想闰年)那为什么不呢:

^(?i)T(20[0-9]{6})\.[0-9]{4}$

如果您想知道日期是否真的存在,请捕获它并使用 DateTime.TryParse 方法对其进行测试。

关于c# - 我的正则表达式可以改进吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35841604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com