Как разобрать дату из формата URL? - PullRequest
1 голос
/ 19 октября 2010

Моя база данных содержит URL-адреса, хранящиеся в виде текстовых полей, и каждый URL-адрес содержит представление даты отчета, которая отсутствует в самом отчете.

Так что мне нужно проанализировать дату из поля URL в строковое представление, такое как:

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 Ответ

6 голосов
/ 19 октября 2010

Вы хотите такое регулярное выражение:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...