Группа регулярных выражений не работает для нескольких адресов - PullRequest
1 голос
/ 05 июля 2019

У меня проблема с моим регулярным выражением. Я должен прочитать файл с данными контактов и импортировать его в базу данных. Строка имеет стандартный формат, и я могу прочитать все строки, извлечь имя контакта, улицу / дом, почтовый индекс и город. У меня проблема в том, что номер housenumber может быть либо числом, либо примерно таким: «7/9».

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

String addressPattern = "^" 
                      + "(?<street>(?:\\p{L}| |\\d|\\.|-)+?) "
                      + "(?<number>\\d+(?: ?- \\// ?\\d+)? *[a-zA-Z]?) "
                      + "(?<zip>\\d{5}) "
                      + "(?<city>(?:\\p{L}| |-)+)"
                      + "(?: *\\((?<suffix>[^\\)]+)\\))?" + "$";

Регулярное выражение: ^(?<street>(?:\p{L}| |\d|\.|-)+?) (?<number>\d+(?: ?- ?\d+)? *[a-zA-Z]?) (?<zip>\d{5}) (?<city>(?:\p{L}| |-)+)(?: *\((?<suffix>[^\)]+)\))?$

Вот адресная часть.

  1. First Street 32 78224 firstCity
  2. Second Street 7/9 73430 secondCity
  3. Third Street 32 78224 third/City
  4. Fourth Street 9/7 73430 fourth/city

Первый и третий примеры в порядке. Я могу читать данные. Но второе и четвертое возвращают пустую строку.

Может кто-нибудь может мне помочь?

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Вы можете использовать дополнительные группы:

^(?<street>[\pL\pN.]+(?:\h+[\pL\pN.]+)*)\h+(?<number>\d+(?:/\d+)?)\h+(?<zip>\d{5})\h+(?<city>\pL+)(?<suffix>/\pL+)?$

О шаблоне

  • ^ Начало строки
  • (?<street>
    • [\pL\pN.]+ Совпадение 1+ раз с любым из перечисленных
    • (?: Группа без захвата
      • \h+[\pL\pN.]+ Совпадение 1+ раз с любым из перечисленных
    • )* Закрыть группу без захвата и повторить 0+ раз
  • )\h+ Закрыть группу улиц, сопоставить 1+ горизонтальных пробелов
  • (?<number>
    • \d+(?:/\d+)? Совпадение цифр 1+ с необязательной / цифрой
  • )\h+ Закрытие группы номеров, совпадение 1+горизонтальные пробелы
  • (?<zip>
    • \d{5} Совпадение 5 цифр
  • )\h+ Закрыть группу zip, сопоставить 1+ горизонтальные пробелы
  • `(? \ PL +) Соответствующий город
  • (?<suffix>/\pL+)? Соответствующий необязательный суффикс
  • $ Конец строки

Regexдемо | Демонстрация Java

На Java

String regex = "^(?<street>[\\pL\\pN.]+(?:\\h+[\\pL\\pN.]+)*)\\h+(?<number>\\d+(?:/\\d+)?)\\h+(?<zip>\\d{5})\\h+(?<city>\\pL+)(?<suffix>/\\pL+)?$";
0 голосов
/ 05 июля 2019

Я бы увидел более простое регулярное выражение: ^(?<street>\D*)\s(?<number>[\d\/]+)\s(?<zip>\d{5})\s(?<city>.*)$

  • street - это все, кроме цифры
  • number - это цифры / косая черта
  • zip 5 цифр
  • city остальное

Это хорошо соответствует вашим 4 строкам: regex demo

...