0

在我们的数据库中,我们有 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|WA|WV |威|怀)))

尝试使第一个单词成为可选会导致表达式仅返回“Springs”,而不是“Palm Springs”,这在上面的表达式中绝对匹配:.*(?i)(?((((,\s|\s) {2,})\w+) ? (\s\w+)))(?=(,\s+|\s+)

谢谢你的帮助!

4

3 回答 3

1

这可能过于宽泛,但它可能对您有用,具体取决于您使用的正则表达式实现:

(.+?),\s*(.+?)(?:,\s|\s\s)(.+?)\s(\d{5})

这将从您的示例中返回以下组:

('1977 S. Joshua Tree PL', 'Palm Springs', 'CA', '92264')
于 2013-07-01T19:02:58.777 回答
1

就个人而言,我认为我会采取完全不同的方法。我会将邮政编码视为权威,因为它是您可用的最细粒度的数据。我会得到一个邮政编码到城市映射的列表。提取地址的邮政编码部分。根据邮政编码在新的数据库字段中写入城市和州值。然后编写一个脚本来检查每个数据条目,并确定是否可以在您的字符串中找到基于邮政编码的城市和州名。如果可以,请从字符串中删除这些值。并将该记录标记为已成功处理。如果他们无法将记录标记为您可能需要对其执行手动审核的记录。

另一种替代方法可能是使用像谷歌地图这样的 API,将您的地址字符串发送到并希望得到一个干净的地址。

于 2013-07-01T18:50:02.637 回答
-1

对于这样的事情,我总是更喜欢命名捕获组。所以试试

(?<addr>[^,]+),\s+(?<city>[^,]+),\s+(?<state>[A-Za-z]{2})\s+(?<zip>\d{5}(-\d{4})?)

解析你的例子这会给你

  • 地址:1997 S. Joshua Tree PL
  • 城市:棕榈泉
  • 州:加州
  • 邮编:92264

我也支持扩展的邮政编码格式。

您可以从这个正则表达式生成的匹配中提取城市组的值。

于 2013-07-01T19:09:06.130 回答