涵盖多种日期格式的java正则表达式
选择什么正则表达式来覆盖以下所有场景: 基本上我必须提取前缀和后缀
前缀。YYYY-MM-DD-HH-MM-SS。后缀
YYYY-MM-DD是强制性的
HH-MM-SS是可选的。(可以是HH-only或HH-MM或HH-MM-SS)
样本:
“test1.2020-03-07-00.test.com”
“test2.2020-03-06-16.test2.test1.com”
“test3.2020-03-06-16-13-40.test2.test1.com”
“test4.2020-03-06-16-13.test.com”
“test5.ext.2020-03-11-17-57.test1.com”
“test6.ext.2020-03-11.test1.test2.test3.com”
我使用这个正则表达式,但它失败了:
Pattern.compile(".\\d{4}-\\d{2}-\\d{2}(-\\d{2}-\\d{2}-\\d{2})?.*?");
# 1 楼答案
首先请记住
.
句点是一个特殊的正则表达式模式,它匹配任何字符,所以要特别匹配句点,需要将其转义为\.
你自己说过时间部分可以是HH only或HH-MM或HH-MM-SS,所以你不应该期望
(-\\d{2}-\\d{2}-\\d{2})?
与之匹配。因为您不需要捕获它,所以使用(?:...)
非捕获组,并将它们嵌套:(?:-\\d{2}(?:-\\d{2}(?:-\\d{2})?)?)?
。更好的是,因为这三个部分是相同的,所以使用(?:-\\d{2}){0,3}
你说“我必须提取前缀和后缀”,所以你应该将其添加到模式中
输出