Регулярное выражение для синтаксического анализа адресов в требуемом формате

#regex

#регулярное выражение

Вопрос:

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

Случай 1:

 Address Format : (House_NMBR)(SPACE)(STREET)
  

Для разбора номера дома в поле адресной строки, которое начинается с номера. -/ символы разрешены. Отдельные буквы также разрешены в домашнем nmbr.

Ниже приведены некоторые из допустимых данных для номера дома:

Ожидаемые данные:

11

11-11

11-11-11

11 A

11A

11/A

11/ A,

Я написал регулярное выражение ниже,

Шаблон регулярных выражений

 (^[0-9] [s]?[A-Za-z]{0,1}[-]?[/]?[0-9]?[s]?[A-Za-z]{0,1}[-]?[/]?[0-9]?[s]?[A-Za-z]{0,1}[,]?)
  

Он анализирует 1-1-1 или 11-11, но не анализирует 111-111.

Случай 2:

 Address Format : (HouseNmbrExtension)(space)(HouseNumber)
  

Возможно, может появиться список слов, таких как номера этажей (1-й этаж, 2-й этаж) или Suite, Level и т.д., За которыми следует номер. Числовой шаблон после последнего пробела переходит в часть номера дома.

Ожидаемые данные:

УРОВЕНЬ 12 333 >> Уровень 12 (расширение дома), 333 (номер дома)

SUITE32 33/44 >> SUITE32 (расширение дома), 33/44 (номер дома)

1-й ЭТАЖ 300 >> 1-й ЭТАЖ (расширение дома), 300 (номер дома)

3-й FL 900 >> 3-й FL (расширение дома), 900 (номер дома)

Блок 12 22A >> Блок 12 (расширение дома), 22A (номер дома)

Шаблон регулярных выражений:

 (Level ?.*|Suite [0-9] ?[-]?[0-9]??.*|Unit [0-9] ?[-]?[0-9]?|Tower ?.*|.* Floor?.*|FL ?.*|.*?)
s
(^[0-9] [s]?[A-Za-z]{0,1}[-]?[/]?[0-9]?[s]?[A-Za-z]{0,1}[-]?[/]?[0-9]?[s]?[A-Za-z]{0,1}[,]?)
  

Но результат не соответствует ожиданиям.

Как мне правильно проанализировать шаблоны?

Комментарии:

1. IMO вам нужно будет иметь разные регулярные выражения для разных случаев и проверять одно за другим, что соответствует целому вводу, а затем использовать это для извлечения информации и полей из ввода. Одно регулярное выражение для всех этих случаев было бы невозможным монстром IMO

2. Для случая 1 для сопоставления данных House_NMBR вы можете использовать это ^d (?:[- /]*[a-zA-Z0-9] )*,? а для случая 2, почему бы вам просто не использовать это (. ) (.*) регулярное выражение, потому что в случае 2 вы буквально разрешаете все, так какой смысл даже жестко кодировать строки, которые вы видели до сих пор? Ваше регулярное выражение case2 будет постоянно обновляться по мере того, как вы будете видеть новые данные в своих реальных примерах.

3. Хотя, если вы действительно хотите попробовать для случая 2, более аккуратное регулярное выражение, соответствующее вашим текущим образцам, может быть записано следующим образом ^((?:LEVEL|SUITE|Unit) *d |d [a-z]{2} FL(?:OOR)?) (.*)$

4. Почему бы и нет (.*) ([a-zA-Z0-9/] )$ ? Номер дома кажется четко определенным, и вы на самом деле не нормализуете другую часть в любом случае.

5. Вам нужно описать словами, каковы ваши правила. Вы только что привели примеры, но этого недостаточно, чтобы знать, каким должно быть регулярное выражение.