+1 提出一个有趣的问题。这绝对是一个编程设计问题,但也几乎是一个 UX 问题。
我认为你可以在一个领域做到这一切。我在SmartyStreets工作,我们在那里解析和处理地址。以下是我从经验中学到的一些与您的问题相关的东西:
- 不要使用正则表达式来解析或确定地址。它太复杂了。地址有许多不同的形式,就像 Matej 说的那样。“自由格式字符串”可以是任何东西。诱惑是使用正则表达式,但有一种更聪明的方法。
- 很少有位置/地址 API 真正提供您正在寻找的价值和结果,至少根据它们的 TOS。例如,Google、Yahoo! 和其他要求显示地图并且不允许自动查询(例如,没有用户主动发起请求)。
- 大多数 API 只执行地址近似,不执行地址验证。因此,您得到的结果充其量只是一个猜测。谷歌擅长猜测,但结果可能会返回看起来合法但实际上并非如此的结果。我已经看到了很多,它咬了我。地理定位/地理编码 API 有其一席之地,但它们也有其局限性。
因此,举个例子:用户在该文本字段中键入 POI 或地址。你不确定它是哪一个,或者两者兼而有之。如果您知道,POI 或地址是否存在?我不知道同时执行两者的(便宜的)API——我见过企业级的API,但是……可能太贵了。这是我会尝试的一种更简单的方法。
查找经 CASS 认证的服务以检查地址。SmartyStreets 的LiveAddress API(主页上的不同演示)就是这样一种服务(价格便宜,甚至对低容量使用免费)。虽然 API 不直接解析单行地址,但使用这个算法真的很容易(这里有一个工作示例)——在 Objective C 中更容易,因为你不必像在 Javascript 中那样弄乱 JSONP .
如果 LiveAddress 或同等服务(我鼓励您做一些研究,如果您有其他问题,请告诉我——我很乐意提供帮助)返回任何结果,字符串是地址。请注意,某些 CASS 认证的服务也会返回虚假地址或猜测,并且很难/不可能区分两者。LiveAddress 只会返回有效地址。因此,如果 LiveAddress 返回一个结果(通常是第一个,使用上述算法),则该字符串肯定是一个地址,或者是一个 POI 后跟一个地址。(是的,LiveAddress 将对每个地址进行地理编码。)
如果未返回任何结果,则它是 POI/企业名称。如果您的应用程序遵循 Google 或 Yahoo 的 TOS,请查询他们的 API,因为他们擅长猜测并找到更通用的匹配项。
甚至另一种选择是先查询 Maps API,然后使用它返回的地址(如果有)通过 LiveAddress 发送它以确保它存在并了解更多信息。
希望能为您指明正确的方向(没有双关语)。如果您想澄清任何事情或有任何其他与地址相关的问题,请告诉我。