正则表达式可选用空格或逗号(城市,州)分隔的所有内容

时间:2017-11-06 20:39:30

标签: regex regex-greedy

我试图从一个不完整的地址列表中获取街道,城市,州和邮政编码,除了“街道”之外的所有内容都是可选的。 (我可以有街道,街道+城市,街道+城市+州,街道+城市+州+邮编)。分隔符可以是逗号+空格,也可以是空格。

到目前为止,我有

^(?<STREET>.*?)(?<SEPARATOR1>(?: *-{1,2} *)|(?:, ?))(?<CITY>[a-z-' ]*)?((?<SEPARATOR2>(?: )|(?:, ))(?<STATE>AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY))?((?<SEPARATOR3>(?: )|(?:, ))(?<ZIP>[0-9]{5}(-[0-9]{4})?))?

我很难在CITY捕获后获取捕获,如果它只用空格分隔。

测试数据:

123 Ave Ave - Hoquiam WA 98103
123 Ave Ave - Hoquiam, WA 98103
123 Ave Ave - Hoquiam, WA 98103-1345
123 Ave Ave - Hoquiam
123 Ave Ave - Ocean Shores WA
123 Ave Ave - Ocean Shores, WA
123 Ave Ave - D'ile, WA
123 Ave Ave

我做错了什么?

https://regex101.com/r/v476Gx/1

2 个答案:

答案 0 :(得分:2)

通过一些调整,以下更新的正则表达式应该适合您:

^(?<STREET>.*?)(?:(?<SEPARATOR1>(?: *-{1,2} *)|(?:, ?))(?<CITY>[a-z-' ]*?)?((?<SEPARATOR2>(?: )|(?:, ))(?<STATE>AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY))?((?<SEPARATOR3>(?: )|(?:, ))(?<ZIP>[0-9]{5}(?:-[0-9]{4})?))?)?$

Updated RegEx Demo

答案 1 :(得分:0)

虽然你有答案,但这可能更具可读性/可维护性:

^
(?P<street>[^-\n]+)
(?:-\h*)?
(?P<town>(?:(?!\b[A-Z]{2}\b).)*)
(?P<state>\b[A-Z]{2}\b)?\h*
(?P<zip>[-\d]*)
$

a demo o nregex101.com。它只需要在城镇部分进行一些清洁。