正则表达式可选的一切由 space 或逗号分隔(城市,州)
Regex optional everything separated by space or comma (city, state)
我正在尝试从格式不正确的地址列表中获取街道、城市、州和邮编,除了 "street" 之外的所有内容都是可选的。 (我可以有街道,街道+城市,街道+城市+州,街道+城市+州+邮编)。分隔符可以是逗号 + space,也可以是 space。
到目前为止,我有
^(?<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})?))?
如果仅由 space 分隔,我将无法在 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
我做错了什么?
经过一些调整,更新后的正则表达式应该适合您:
^(?<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})?))?)?$
虽然您有答案,但可能更多 readable/maintainable:
^
(?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。它只是需要对城镇部分进行一些清洁。
我正在尝试从格式不正确的地址列表中获取街道、城市、州和邮编,除了 "street" 之外的所有内容都是可选的。 (我可以有街道,街道+城市,街道+城市+州,街道+城市+州+邮编)。分隔符可以是逗号 + space,也可以是 space。
到目前为止,我有
^(?<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})?))?
如果仅由 space 分隔,我将无法在 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
我做错了什么?
经过一些调整,更新后的正则表达式应该适合您:
^(?<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})?))?)?$
虽然您有答案,但可能更多 readable/maintainable:
^
(?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。它只是需要对城镇部分进行一些清洁。