Scala中匹配mm/dd/yyyy与mmddyyyy日期格式的通用正则写法
Scala环境下兼容两种日期格式的正则实现方案
核心调整逻辑非常简单:你原有针对mm/dd/yyyy格式编写的正则本身已经包含了完整的闰年判断、大小月日期合法性校验,不需要改动核心日期匹配规则,只需要把正则里固定匹配斜杠的\/替换为\/?即可——?代表匹配前一个字符0次或1次,刚好覆盖「有斜杠分隔」和「无斜杠纯数字」两种场景,Scala基于JDK的正则引擎完全支持该语法。
调整完成的通用正则
^02\/?(?:[01]\d|2\d)\/?(?:19|20)(?:0[048]|[13579][26]|[2468][048])|(?:0[13578]|10|12)\/?(?:[0-2]\d|3[01])\/?(?:19|20)\d{2}|(?:0[469]|11)\/?(?:[0-2]\d|30)\/?(?:19|20)\d{2}|02\/?(?:[0-1]\d|2[0-8])\/?(?:19|20)\d{2}$
Scala环境使用注意
Scala中字符串默认会把反斜杠作为转义字符,定义正则时推荐用三引号包裹原生字符串,避免重复写转义符,参考使用示例:
// 定义正则实例 val datePattern = """^02\/?(?:[01]\d|2\d)\/?(?:19|20)(?:0[048]|[13579][26]|[2468][048])|(?:0[13578]|10|12)\/?(?:[0-2]\d|3[01])\/?(?:19|20)\d{2}|(?:0[469]|11)\/?(?:[0-2]\d|30)\/?(?:19|20)\d{2}|02\/?(?:[0-1]\d|2[0-8])\/?(?:19|20)\d{2}$""".r // 匹配校验示例 val testSet = Seq("02/29/2020", "02292020", "12/31/1999", "12311999", "04302024", "02/28/2023") testSet.foreach(item => println(s"$item 匹配结果:${datePattern.matches(item)}"))
匹配规则说明
- 完全兼容你原有的
mm/dd/yyyy格式匹配能力,不会出现合法日期漏匹配的问题 - 新增支持无分隔符的
mmddyyyy8位数字日期,同样继承原正则的合法性校验逻辑,会自动拦截02302024、13322020这类非法日期 - 仅允许斜杠作为分隔符,不会误匹配横杠、点号等其他分隔的日期格式,符合你的字段格式要求
内容的提问来源于stack exchange,提问作者whatsinthename
相关产品推荐
相关产品推荐

