Захват всего остального в строке с помощью регулярных выражений - PullRequest
0 голосов
/ 12 апреля 2020

Мне нужно извлечь 3 вещи из строки, почтового ящика, адреса улицы и всего остального.

Вот как будет выглядеть строка:

DUNHOUR AGENCY IN C PO BOX 48 44 TANNER STREET HADDONFIELD NJ 08033 VERONA NJ 070440324

Мне удалось извлечь адрес PO и улицу, используя следующее регулярное выражение, но я бегал кругами, чтобы получить оставшуюся часть строки.

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

\b(PO BOX \d{2,5}|PO Box \d{2,5}|P.O. BOX \d{2,5}|P O BOX \d{2,5})?\s*(\d+\s[A-z]+\s[A-z]+)\s(\d+\s[A-z]+)?

Как получить все остальное при совпадении последней группы?

Я также должен иметь возможность извлекать остальные данные, если PO отсутствует информация о ящике:

* BENNETTI-HOLMES INSURANCE 43 VOSHELL MILL ROAD DOVER DE 19904

Я должен получить false для PO, получить адрес улицы и все остальное в последнем групповом матче.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Несколько небольших заметок о шаблоне в вашем опубликованном ответе.

  • Эта часть [A-z] соответствует больше, чем [A-Za-z]
  • Эта часть необязательно (\sROAD|STREET|AVENUE|DRIVE|RD|ST|AV|DR)?, поэтому ваш шаблон будет совпадать, если вы его опустите
  • В этой части \sROAD символ пробела будет соответствовать только до ROAD и не будет применяться к другим альтернативам
  • Примечание что \s может также соответствовать новой строке и экранировать точку \., чтобы буквально соответствовать ей

Вы можете обновить шаблон до

\b((?:P ?O|P\.O\.) B(?:ox|OX)\s*\d{2,5})?\s*(\d+\s[A-Za-z]+(?:\s[A-Za-z]+)*\s(?:ROAD|STREET|AVENUE|DRIVE|RD|ST|AV|DR))\s(.{0,100})

В отдельных частях:

  • \b Граница слова
  • ( Захват группа 1
    • (?:P ?O|P\.O\.) Соответствует вариантам PO PO или PO
    • B(?:ox|OX) Соответствует либо Box или BOX
    • \s*\d{2,5} Соответствует 0+ пробелам и 2-5 цифрам
  • )? Закройте группу 1 и сделайте необязательно
  • \s* Соответствие 0+ пробельных символов
  • ( Захват группа 2
    • \d+\s[A-Za-z]+ Соответствие 1+ цифр и 1+ символы A-Za-z
    • (?:\s[A-Za-z]+)* Повторите 0+ раз, сопоставляя символ пробела и 1+ раз A-Za-z
    • \s(?:ROAD|STREET|AVENUE|DRIVE|RD|ST|AV|DR) Сопоставьте символ пробела и одну из альтернатив
  • ) Закрыть группу 2
  • \s Соответствовать символу пробела
  • (.{0,100}) Захват группа 3 , соответствовать любой символ кроме новой строки 0-100 раз

Regex demo

0 голосов
/ 12 апреля 2020

Наконец удалось сделать это, используя

\b(PO BOX \d{2,5}|PO Box \d{2,5}|P.O. BOX \d{2,5}|P O BOX \d{2,5})?\s*(\d+\s[A-z]+\s[A-z]+\b(\sROAD|STREET|AVENUE|DRIVE|RD|ST|AV|DR)?)\s+(.{0,100})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...