【发布时间】:2013-06-28 23:36:13
【问题描述】:
在我们的数据库中,我们有 1 个“地址”字段,将完整地址存储为文本。我正在将地址拆分为以下字段:Line1、City、State、Zip。 (美国地址)。我在解析 state 和 zip 方面有很好的表达方式,但我在解析 city 时遇到了一些困难。
基本上,我使用以下规则来解析城市:
- 它必须出现在状态之前
- 它前面可以有一个逗号,也可以有两个或多个空格。
- 如果以上都不成立,则只返回状态之前的 1 个单词。
我对验证这些地址不感兴趣。
这是我一直在使用的 RegEx 示例,它非常适合解析由逗号或超过 2 个空格分隔的地址组件,但如果我尝试包含前 1 个词的替代词:
示例地址:1977 S. Joshua Tree PL, Palm Springs, CA 92264
.*(?i)(?((((,\s|\s{2,})\w+)+(\s\w+)))(?=(,\s+|\s+)(阿拉巴马|阿拉斯加|亚利桑那|阿肯色|加利福尼亚|科罗拉多|康涅狄格|特拉华|佛罗里达|乔治亚|夏威夷|爱达荷|伊利诺伊|印第安纳|爱荷华|堪萨斯|肯塔基|路易斯安那|缅因|马里兰|马萨诸塞|密歇根|明尼苏达|密西西比|密苏里|蒙大拿|内布拉斯加州|内华达|新罕布什尔|新泽西|新墨西哥|纽约|北卡罗来纳|北达科他|俄亥俄|俄克拉荷马|俄勒冈|宾夕法尼亚|罗德岛|南卡罗来纳|南达科他|田纳西|德克萨斯|犹他|佛蒙特|弗吉尼亚|华盛顿|西弗吉尼亚|威斯康星|AL|AK|AZ|AR|CA|CO|CT|DE|FL|GA|HI|ID|IL|IN|IA|KS|KY|LA|ME|MD|MA| MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VT|VA|西澳|西弗吉尼亚|威|威)))
尝试将第一个单词设为可选会导致表达式仅返回“Springs”,而不是“Palm Springs”,这在上面的表达式中绝对匹配: .*(?i)(?((((,\s|\s{2,})\w+)?(\s\w+)))(?=(,\s+| \s+)
感谢您的帮助!
【问题讨论】:
-
您使用的是哪个正则表达式实现?
-
您在这里不是在技术上验证地址(至于您的所有州等),因为您可以简单地输入
666 Devils Street, Devil County, HI 66666,因此更广泛的地址可能没问题。 -
willOEM:使用 .NET。
标签: regex