【发布时间】:2016-03-07 10:40:44
【问题描述】:
是的,另一个正则表达式问题。不客气;-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,不区分大小写。 -
20YYYY 以 20 开头(我将在 2100 年前死去,所以我不再关心任何事情:-P) -
[0-9]{2}0 到 99 之间的任意数字,表示 YYYY 的第二部分。 -
[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 等。如前所述,我以此为契机学习正则表达式,并认为这是一个很好的起点。很抱歉浪费了我的时间,我应该在原帖中说明这一点。
【问题讨论】:
-
你有一个好的开始。点需要转义:
\.,否则它将匹配任何字符。我建议进行以下改进:(?i)T->[Tt](它更短,我不确定(?i)是否允许内联);始终使用[0-9]或\d。我建议在正则表达式之外验证日期,因为闰年规则很复杂,你的正则表达式会变得混乱。 -
为什么不使用 DateTime.Tryparse 并在日期有效时让它处理。更简单,并且如果您的格式/要求更改更容易调整!另外,您将如何处理正则表达式中的闰年?
-
@Heinzi,这有点矫枉过正,你只需要
DateTime.TryParseExact,在捕获的子字符串上使用yyyyMMdd格式
标签: c# regex validation