如何分离MySQL中混合在一起的地址字符串

如何分离MySQL中混合在一起的地址字符串,mysql,regex,Mysql,Regex,我在MySQL中有一个地址字符串,它已从源代码中混合在一起。我认为在MySQL中可以使用正则表达式或其他方法将字符串分割成可用部分,但我不知道如何实现这一点 基本上,每个字符串都类似于这些示例(我在顶部添加了一个标记,以显示每个位是什么): 123假街景RVIC3001 布鲁克斯疗养院123小假街2001 格兰奇警察局1童话兰格朗格瓦购物中心8001 地址应该被分成两行地址信息,郊区、州和邮政编码。我在澳大利亚,所以该州将是新南威尔士州、维多利亚州、昆士兰州、佤邦、南澳州、新界或ACT,邮编

我在MySQL中有一个地址字符串,它已从源代码中混合在一起。我认为在MySQL中可以使用正则表达式或其他方法将字符串分割成可用部分,但我不知道如何实现这一点

基本上,每个字符串都类似于这些示例(我在顶部添加了一个标记,以显示每个位是什么):


123假街景RVIC3001
布鲁克斯疗养院123小假街2001
格兰奇警察局1童话兰格朗格瓦购物中心8001
地址应该被分成两行地址信息,郊区、州和邮政编码。我在澳大利亚,所以该州将是新南威尔士州、维多利亚州、昆士兰州、佤邦、南澳州、新界或ACT,邮编将始终是一个4位数的数字

拆分的可能方法是,郊区将始终大写,州和邮政编码将在最后6或7个字符(取决于州)内可预测,前两行地址信息将被拆分,以防中间没有空格字符


我有大约100000张这样的唱片,所以手工翻阅会非常耗时。如果您能以编程方式提供帮助,我们将不胜感激。

没有空格吗?最恶心

MySQL没有处理这些问题的工具,因此您必须使用外部程序访问数据库。我倾向于使用Perl进行这样的操作

从结尾开始,然后倒转。。。我们知道最后四个应该是数字,前面的字母是7个选项中的一个。运用这些知识,你将减少2个字段和6-7个字符

看起来你的例子的末尾有一个大写的城镇。。。解析出来,它应该与州和区号匹配。我相信你可以在网上几分钟内找到一个邮政编码数据库


由于名字和街道地址仍然存在,这将有一些变化,我希望你在那里有点运气。你可以先把注意力集中在小写和大写之间,或者字母和数字之间没有空格作为转折点。

接受挑战。我甚至会加入一些基本的标点符号来表示“101 St.Mark’s St.”等等

/^(([\w\'\.](?=[a-z \'\.])| )+[a-z\'\.])?(([\w\'\.](?=[a-z \d\'\.])| )+[a-z\.\'])([A-Z]+)(NSW|VIC|QLD|WA|SA|NT|ACT)(\d{4})/
可能需要更多的清理,但它应该可以在任何支持带lookahead的基本regex的语言中工作(一些实现,比如JavaScript和(我认为)Ruby,支持lookahead,但不支持lookahead)。(这一点,加上这个谜题,让我一直睡不着。)至少,它对你提供的三个例子有效

顺便说一句,这是一个快速测试正则表达式的好网站。这就是我过去解决这个难题的方法。建造它的人一定是个真正的天才。(科夫·科夫)


是另一个很好的选择,不过由于它是通过在后台对Ruby脚本进行Ajax调用来工作的,所以速度会慢一些。不过,它确实有一个很好的特性,可以链接到输入的模式和干草堆。有一天,解决2个问题的人真的应该着手实现类似的东西。

如果有人提出“123麦当劳之路”,会发生什么情况呢?情况会有所改变,这不是地址部分边界。我会用你最喜欢的脚本语言标记,比如perl、python、sed和awk,而不是mysql。在分离前两个字段时会遇到实际问题。编程语言是解决这个问题的更好方法。
/^(([\w\'\.](?=[a-z \'\.])| )+[a-z\'\.])?(([\w\'\.](?=[a-z \d\'\.])| )+[a-z\.\'])([A-Z]+)(NSW|VIC|QLD|WA|SA|NT|ACT)(\d{4})/