2010-12-14 61 views
5

我必须解决一个正则表达式问题,可能是特定的,通过堆栈溢出寻找我已经取得了一些很好的发现,但一直没有能够将它们拼凑在一起,使其工作。修复与正则表达式的街道名称

基本上我想这样的:

lorem ipsum north road =>lorem ipsum rd (n)

north lorem ipsum rd =>lorem ipsum rd (n)

lorem ipsum road north =>lorem ipsum rd (n)

为自动完成计划的一部分,我需要的部分文本转换到正确的版本,因此它可以检查数据库

lorem ipsum soUTH RD =>lorem ipsum rd (s)

west lorem ipsum road =>lorem ipsum rd (w)

我不希望有人来这个节目对我的代码,但我想知道最好的解决问题的方法。

现在你可能会问我,为什么我烦心,因为人们不会用这样的f'd了语法写的,但那是因为我不是只处理英文:(

干杯

+4

这是一个巨大的挑战。我之前创建了一个可以找到街道类型(例如“街道”,“街道”,“大道”,“Ave”等)的RegExp,但即使这是一个超过200个字符的RegExp。解决这个问题比这更复杂。像“北路”,“西大街”等边缘案例会使其更具挑战性。 – 2010-12-14 05:05:25

+1

我认为这是一个不应该用一个大的正则表达式解决的问题。将任务分成小步骤并单独完成这些操作会比较简单:例如,检查北,ñ等等,并添加一个“(n)”到最后;检查其他方向;检查“道路”的缩写...等。如果你以不同的步骤完成每一步,它可能会更容易遵循,也更容易编写。 – 2010-12-17 18:57:42

+1

噢,另一个想法是:如果你一步一步做,你可以选择撤销你的修改并再次尝试查找:有可能某个街道有你替换的实际名称。 – 2010-12-17 18:59:59

回答

0

对于你问题的第一部分,将下面的伪正则表达式看起来像你所追求的?

(<direction>?) <road name> (<direction>?) <road type> (<direction>?) 

然后你检查每三个可选<direction>正则表达式,包括你想给它什么条件。你需要来w ith <direction><road name>,和<road type>正则表达式自己。那些正则表达式可能应该是特定的,例如(公路)|(RD)|(街道)|(ST)。

对于问题的第二部分(即自动完成),您可能需要为上面提到的一些或所有正则表达式类别(即路线,道路名称和道路类型)编制索引,具体取决于您想要的数量自动完成。

3

对我来说似乎最困难的是用正则表达式在正确位置查找正确的单词,所以虽然不够高雅,但是这是否可以通过最小正则表达式来实现呢? :

  1. 提取所有已知的从 地址线,hopefuly,我们会留下 道路名称的单词和 及其变化(道路类型, 方向,数字,...)。

  2. 把地址线写回去,但是在 我们需要的命令(道路名称+道路类型+方向)。

一旦你摆脱的位置,在更多钞票理论的变化依然较大,但可预见的变化不应该是大,甚至占拼写错误:大道:Avenu,雅漾,Aveniu,AVN, Av,Avn。路:Rd,Roud,Roade,Roud?

+0

这就是我将如何做的。正则表达式的格式太依赖于能够正确执行工作,因为用户可以按任意顺序键入* anything *。通过删除所有已知单词(和组合)并跟踪所有这些更改,您可能能够获得正确的结果。 – Joost 2010-12-17 18:58:46

+0

我之前在VB6中为每天创建邮件标签的应用程序完成了此操作。这是一个成功的方法,但你肯定需要对所有想要替换的组合进行修改。无论何时,我都会遇到疯狂地址的问题,因此您需要密切注意事项并为偶尔的疯狂地址添加否定过滤器(字符串不接触),这些地址不是常规模式。 – zanlok 2010-12-17 20:24:15