Вы хотите такое регулярное выражение:
"^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()
вам придется заставить шаблон съесть всю входную строку, добавив .*$
к шаблону.)