我有这个正则表达式匹配以下字符串:
<!-- 09-02-2009 --->
<!-- 09-02-2009 12:00:00 --->
<!-- 09-02-2009 12:00:00 A --->
<!-- 09-02-2009 12:00:00 AM --->
以下是模式:
<!-- (?<month>\d{2}?)-(?<day>\d{2}?)-(?<year>\d{4}?)(?:(?: ?\d{2}:?){3}?(?: ?[aApP][mM]?)?)? --->
更新模式,每个扭曲:
<!-- (?<month>\d{2}?)-(?<day>\d{2}?)-(?<year>\d{4}?)(?<time>(?: ?(?:\d{2}:){2}\d{2})?(?: ?[aApP][mM]?)?)? --->
我能做些什么来简化这种模式吗?
谢谢!
这是我提出的所有评论/答案以及内置验证的模式。这有点难看,但谁说正则表达式需要漂亮? :P
<!-- (?<month>(?:0[1-9]|1[0-2]))-(?<day>(?:0[1-9]|1[0-9]|2[0-9]|3[01]))-(?<year>\d{4})(?<time> (?:0[0-9]|1[0-9]|2[0-3]):(?:[0-5][0-9])(?::[0-5][0-9])?(?: [aApP][mM]?)?)? --->
它将按以下格式匹配有效日期:
<!-- 09-02-2009 --->
<!-- 09-02-2009 12:00 --->
<!-- 09-02-2009 12:00 A --->
<!-- 09-02-2009 12:00 AM --->
<!-- 09-02-2009 12:00:00 --->
<!-- 09-02-2009 12:00:00 A --->
<!-- 09-02-2009 12:00:00 AM --->
答案 0 :(得分:3)
<!-- (?<month>\d\d)-(?<day>\d\d)-(?<year>\d{4})(?: \d\d:\d\d:\d\d(?: [aApP][mM]?)?)? -->
就像我能想到的一样简单。请注意,这个正则表达式并不完全相同,因为在原始版本中,时间戳冒号都是可选的,这意味着它将匹配01:0203或0102:03:等。我认为我的版本可能更正确。
基本上我删除了所有非捕获组和量词,当它们只是加倍一个数字时,它的可读性就会降低,而不是更多。我还删除了量词上的贪婪修饰符,因为它们总是完全匹配2或4或者无论是否贪婪。
当然,这将匹配无效日期,例如13-32-0000。要解决这个问题,您必须确定一个复杂但正确的解决方案是否比一个简单易懂的解决方案更合适。基本上,这取决于你对将要运行的文本的信心。如果您想要过滤掉可能存在误报,请寻求更正确的解决方案,即使它的可读性稍差。
答案 1 :(得分:0)
这是我的看法......
(?<month>\d{2}?)-(?<day>\d{2}?)-(?<year>\d{4})(?:\s\d{2}:\d{2}:\d{2}\s?[aApP]?[mM]?)?
似乎无法缩短它。
答案 2 :(得分:0)
为什么要使用Regex,而不是使用.NET中包含的Convert.ToDateTime()
,DateTime.Parse()
或DateTime.TryParse()
方法?