регулярный адрес - PullRequest
       60

регулярный адрес

19 голосов
/ 22 февраля 2012

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

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

строка:

6 утра - 11 вечера, начальная школа Пальма Сола, 6806, Пятая авеню, северо-запад, Брадентон, штат Флорида, 34209 Приходите и найдите прямо рядом с dsfsd sa. Fsa fasdf asfsds.

Regex 1:

/ \ S + (\ d {2,5} \ S +) ([а | р]?! Т \ б) (([A-Za-Z | \ S +] {1,5}) {1, ? 2}) ([\ S | \, |.] +), (([A-Za-Z | \ S +]? {1,30}) {1,4}) (суд | кт | улица | й | привод | др | пер | пер | дорога | й | б-р) ([\ S | \, | | \;.]? +) (([A-Za-Z | \ S +] {1,30}) {1 , 2}) ([\ S | \, |.] +) \ Ъ (АК |? АЛ | АР | AZ | CA | СО | КТ | DC | DE | FL | Г.А. | ГУ | HI | IA | ID | IL | IN | KS | KY | LA | MA | MD | ME | MI | MN | МО | MS | MT | NC | ND | NE | NH | NJ | NM | NV | NY | OH | OK | ИЛИ | PA | RI | SC | SD | TN | ТХ | УТ | ВА | VI | ВТ | ВД | WI | WV | Вайоминг) ([\ s | \, |.]? +) (\ s + \ д {5}) (? [\ S | \ |.] +) / я

(Иногда есть только улица и город, но нет штата или почтового индекса)

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

/ \ Ь (\ d {2,5} \ S +) ([а | р]?! Т \ б) (NW | NE | SW | SE | север | юг | запад | восток | п | е | s |? ш) ([\ S | \ |.] +) ((? [A-Za-Z | \ S +] {1,30}) {1,4}) (суд | кт | улица | улица | привод | др | полоса | пер | дороги | е | б-р) / я

Скрипка с ним: http://jsfiddle.net/isuelt/rMC6P/11/

Ответы [ 4 ]

32 голосов
/ 23 февраля 2012

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

Раньше я работал в компании по проверке адресов. В ответ на ваш вопрос, чтобы «выделить адрес» в текстовой строке, я рекомендую попробовать утилиту извлечения. Там есть несколько, и я предлагаю вам осмотреться, но вот наши , используя входящие из вашего вопроса --- как вы можете видеть, он нашел адрес и подтвердил его :

LiveAddress extraction example

Конечная точка API возвращает JSON, который содержит начальную и конечную позиции каждого адреса, а также множество информации о каждом из них. (См. Вывод CSV внизу рисунка выше.)

Я благодарю вас за то, что вы выдержали те регулярные выражения, которые вы пробовали! Надеюсь, это полезно.

2 голосов
/ 25 апреля 2017

Мне нужно было сделать что-то подобное для адресов типа

800 SE 20 AVENUE # 603, DEERFIELD BEACH

9801 СЗ 3 УЛИЦА АПТ 5, ПЛАНТАЦИЯ

11909 GLENMORE DRIVE # 4-1, CORAL SPRINGS

Это регулярное выражение, которое я использовал

\s*([0-9]*)\s((NW|SW|SE|NE|S|N|E|W))?(.*)((NW|SW|SE|NE|S|N|E|W))?((#|APT|BSMT|BLDG|DEPT|FL|FRNT|HNGR|KEY|LBBY|LOT|LOWR|OFC|PH|PIER|REAR|RM|SIDE|SLIP|SPC|STOP|STE|TRLR|UNIT|UPPR|\,)[^,]*)(\,)([\s\w]*)\n

Возвращает отдельные группы для каждой части адреса (мне не нужно было анализировать имя штата для моего случая). Попробуйте это здесь https://regex101.com/r/OsvOxn/3

0 голосов
/ 11 декабря 2018

Это работает для меня!

if(address.match(/^\s*\S+(?:\s+\S+){2}/)) {
   console.log('good address!')
}
0 голосов
/ 15 августа 2018

Мэтт прав. Разбор регулярных выражений никогда не будет очень точным. У вас неизбежно будет достаточное количество ложных срабатываний и ложных отрицаний, если вы пойдете по этому опасному пути. Однако, если вы согласны с этим, я на самом деле предпочитаю использовать комбинацию из двух регулярных выражений - одно для схем на основе названных улиц и одно для схем городских сетей:

Система названий улиц:

/\b\d{1,6} +.{2,25}\b(avenue|ave|court|ct|street|st|drive|dr|lane|ln|road|rd|blvd|plaza|parkway|pkwy)[.,]?(.{0,25} +\b\d{5}\b)?/ig

Сетка

/(\b( +)?\d{1,6} +(north|east|south|west|n|e|s|w)[,.]?){2}(.{0,25} +\b\d{5}\b)?\b/ig

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

...