Совпадение адреса регулярного выражения regex

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

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

строка:

6 утра - 11 пМ, Пальма Сола Элементарный, 6806 Пятая авеню NW, Bradenton, FL 34209 Приходите найти только около dsfsd sa fsa fasdf asfsds 5001 west ваша мама не живет здесь мой рейнджер 2005 года,

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 |\|.] +)/я

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

regex 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/

Ответ 1

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

Я работал в компании по проверке адресов. В ответ на ваш вопрос, чтобы "выделить адрес" в строке текста, я рекомендую попробовать утилиту для извлечения. Есть несколько вещей, и я предлагаю вам посмотреть вокруг, но здесь ours, используя ввод вашего вопроса - - как вы можете видеть, он нашел адрес и подтвердил его:

LiveAddress extraction example

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

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

Ответ 2

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

800 SE 20 AVENUE # 603, DEERFIELD BEACH

9801 NW 3 STREET APT 5, PLANTATION

11909 ДВИГАТЕЛЬ GLENMORE № 4-1, КОРОЛЬНЫЕ ВЕСНЫ

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

\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

Ответ 3

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

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

/\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

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

Ответ 4

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

if(address.match(/^\s*\S+(?:\s+\S+){2}/)) {
   console.log('good address!')
}