java - 日期时间格式的正则表达式 : "Wednesday, August 08, 2012 9:38:31.113 AM"

标签 java regex

我目前有:

(星期日|星期一|星期二|星期三|星期四|星期五|星期六),?\s+(一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月)\s+[0-3]?[0-9],?\s+[0-2][0-9][0-9][0-9],?\s+([01]?[0-9 ]|2[0-3]):[0-5][0-9]:[0-9][0-9][0-9],?\s+(上午|下午)

...作为我的正则表达式,但是当使用一些测试工具进行断言时,我发现它失败了。哪里搞砸了?我从网络应用程序获取日期时间文本并断言它与上面的正则表达式匹配。

最佳答案

工作工具错误

事实上,每个其他试图修复您的正则表达式的答案都与您犯错的正则表达式的不同部分有关;这应该告诉您它不是适合这项工作的工具。

当正则表达式又短又紧凑时,很难得到正确的结果,这样的长度将是一场噩梦,而且将来没有人能够接触它,因为担心会以某种神秘的方式破坏它.

惯用的Java

SimpleDateFormat.parse() 是 Java 中处理 String 格式的日期信息的惯用方法。

正则表达式用于匹配

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems - Jamie Zawinski

that quote来自 alt.religion.emacs 邮件列表!

糟糕的解决方案来说明为什么 SimpleDateFormat.parse() 是正确的做法。

无论如何,您可以使用正则表达式匹配您想要的内容,但您不应该执行您想要执行的所有验证操作。您将验证逻辑与匹配逻辑混为一谈,两者似乎在某些方面重叠,但在这种情况下,验证应该是代码,而不是正则表达式测试。

(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday), (January|February|March|April|May|June|July|August|September|October|November|December) (\d{2}), (\d{4}) (\d{1,2}):(\d{2}):(\d{2})\.(\d{3}) (AM|PM)

以上表达式将匹配您在标题中请求的字符串。但它不会尝试验证数字的范围,如果您这样做了,您将如何处理闰年和二月?,正则表达式会变得更难以维护。

在这种情况下,您应该使用正则表达式对数据进行分类,以确保它匹配模式或格式,然后将其传递给真正的解析器或传递组到实际执行范围验证和其他操作的方法。

关于java - 日期时间格式的正则表达式 : "Wednesday, August 08, 2012 9:38:31.113 AM",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11888220/

相关文章:

java - 从多个拥有实体到实体的一对一映射

Java 6 - 创建并检测第一个高于 Float.MAX_VALUE 的 Double 值

javascript - 简化此正则表达式以避免术语重复

PHP 正斜杠匹配

regex - Scala:在正则表达式模式字符串中连接字符串导致问题

Java 泛型 : wildcards again

java - 为什么以下代码会返回错误消息 The type Person is already Defined.类(class)人员有什么问题?

java - 带有 Spring Boot lambda 函数的 application.properties 的 AWS secret

JavaScript Regex 仅当字符仅出现后跟字母数字字符时才匹配

Java正则表达式删除虚拟时间戳