2015-09-13 1 views
0

У меня есть HTML-файл, полный адресов, которые мне нужно извлечь. Похоже, но с около 60 улиц, а также несколько номеров на каждой улицеИзвлечение данных из html-файла с помощью Java

<BR> 
    <Font Color=#FF0000 Size=7>MACARTNEY STREET (L)</Font> 
    <BR> 
    <BR> 
    10........<Font Color=#FFFFFF> CM </Font> 
    <BR> 
    <BR> 
    15........<Font Color=#FF0000> SH </Font> 
    <BR> 
    <BR> 
    43A.......<Font Color=#FFFFFF> CM </Font> 
    <BR> 

Я использую регулярное выражение для извлечения данных, который работает лакомство для получения названия улиц

final Pattern STREETNAME = Pattern.compile("<Font Color=#FF0000 Size=7>(.+?)</Font>"); 
    Matcher stMatcher = STREETNAME.matcher(""); 
    while ((line = reader.readLine()) != null) { 
     stMatcher = STREETNAME.matcher(line); 
     if (stMatcher.find()) { 
      String street = stMatcher.group(1); 
      customerList.add(new Customer(street));} 
    //customerList is an array of Customer Objects, defined elsewhere in the program 

но несмотря ни на что, я просто не могу заставить его прочитать номера домов (10, 15 и 43А в примере).

В идеале я хотел бы сохранить строку названия улицы, извлечь номер дома и объединить их вместе, прежде чем создавать объект клиента. Мне также нужно проверить линию CM или SH, но это может подождать.

У кого-нибудь есть идея, которая может помочь? Сейчас я довольно тупой.

Спасибо!

+0

Вы должны использовать что-то вроде Jsoup вместо regex. http://jsoup.org/ –

ответ

0

Это легко (я изменить также существующее регулярное выражение, чтобы соответствовать любому определению цвета), это должно работать и получить номера и дополнительные CM или SH

final Pattern STREETNAME = Pattern.compile("<Font Color=.* Size=7>(.+?)</Font>"); 
final Pattern STREETNUMBER = Pattern.compile("^(\\d[^\\.]*)<Font Color=.*>\\s*(.+?)\\s*</Font>"); 
Matcher stMatcher; 
Customer lastCustomer = null; 
while ((line = reader.readLine()) != null) { 
    stMatcher = STREETNAME.matcher(line); 
    if (stMatcher.find()) { 
     String street = stMatcher.group(1); 
     lastCustomer = new Customer(street); 
    } else { 
     stMatcher = STREETNUMBER.matcher(line); 
     if (stMatcher.find()) { 
      if (lastCustomer != null) { 
       lastCustomer.setStreetNumber(stMatcher.group(1)); 
       lastCustomer.setStreetCmSh(stMatcher.group(2)); 
       customerList.add(lastCustomer); 
      } 
     } 
    } 
} 

Как это работает?

  • картина выглядит для десятичного символа \\d
  • в начале ^ линии,
  • принимает все * символов через первую точку \\. (все, кроме точки: [^\\.])
  • и положить его в группе 1.

Группа 2 заполняется без пробелов \\s.


Я думаю, вы хотите иметь отдельные атрибуты для номера и дополнительной информации. Если не просто конкатенировать совпадения, например.

String lastStreet; // instead of lastCustomer 
... 1st if/then: 
lastStreet = stMatcher.group(1); 
... 2nd if/then: 
customerList.add(new Customer(lastStreet 
    + " " + stMatcher.group(1) 
    + " " + stMatcher.group(2)); 
+0

Большое спасибо, похоже, что это сделает! – Littlewood

Смежные вопросы