我的数据库包含存储为文本字段的URL,每个URL包含报告日期的表示,报告本身缺少该表示。
所以我需要将URL字段中的日期解析为String表示,例如:
2010-10-12
2007-01-03
2008-02-07
提取日期的最佳方式是什么?
部分内容采用以下格式:
http://e.com/data/invoices/2010/09/invoices-report-wednesday-september-1st-2010.html
http://e.com/data/invoices/2010/09/invoices-report-thursday-september-2-2010.html
http://e.com/data/invoices/2010/09/invoices-report-wednesday-september-15-2010.html
http://e.com/data/invoices/2010/09/invoices-report-monday-september-13th-2010.html
http://e.com/data/invoices/2010/08/invoices-report-monday-august-30th-2010.html
http://e.com/data/invoices/2009/05/invoices-report-friday-may-8th-2009.html
http://e.com/data/invoices/2010/10/invoices-report-wednesday-october-6th-2010.html
http://e.com/data/invoices/2010/09/invoices-report-tuesday-september-21-2010.html
请注意,在这两个案例中,th
日后的http://e.com/data/invoices/2010/09/invoices-report-wednesday-september-15-2010.html
http://e.com/data/invoices/2010/09/invoices-report-monday-september-13th-2010.html
使用不一致:
invoices-
其他人采用这种格式(在日期开始前有三个连字符,结尾没有年份,在report
之前可选使用http://e.com/data/invoices/2010/09/invoices-report---wednesday-september-1.html
http://e.com/data/invoices/2010/09/invoices-report---thursday-september-2.html
http://e.com/data/invoices/2010/09/invoices-report---wednesday-september-15.html
http://e.com/data/invoices/2010/09/invoices-report---monday-september-13.html
http://e.com/data/invoices/2010/08/report---monday-august-30.html
http://e.com/data/invoices/2009/05/report---friday-may-8.html
http://e.com/data/invoices/2010/10/report---wednesday-october-6.html
http://e.com/data/invoices/2010/09/report---tuesday-september-21.html
):
{{1}}
答案 0 :(得分:5)
你想要这样的正则表达式:
"^http://e.com/data/invoices/(\\d{4})/(\\d{2})/\\D+(\\d{1,2})"
这利用了URL的/年/月/部分之前的所有内容始终相同,并且直到该月的日期都没有数字。在你拥有它之后,你不关心任何其他事情。
第一个捕获组是年份,第二个月份,第三个捕获组。这一天可能没有前导零;根据需要从字符串转换为整数和格式,或者只是获取字符串长度,如果不是两个,则将其连接到字符串“0”。
举个例子:
import java.util.regex.*;
class URLDate {
public static void
main(String[] args) {
String text = "http://e.com/data/invoices/2010/09/invoices-report-wednesday-september-1st-2010.html";
String regex = "http://e.com/data/invoices/(\\d{4})/(\\d{2})/\\D+(\\d{1,2})";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(text);
if (m.find()) {
int count = m.groupCount();
System.out.format("matched with groups:\n", count);
for (int i = 0; i <= count; ++i) {
String group = m.group(i);
System.out.format("\t%d: %s\n", i, group);
}
} else {
System.out.println("failed to match!");
}
}
}
给出输出:
matched with groups:
0: http://e.com/data/invoices/2010/09/invoices-report-wednesday-september-1st-2010.html
1: 2010
2: 09
3: 1
(请注意,要使用Matcher.matches()
代替Matcher.find()
,您必须通过将.*$
附加到模式来使模式占用整个输入字符串。)