避免重复文字

避免重复文字

问题描述:

假设我有这个字符串:避免重复文字

Address XXXXX city XXXXX 

而这正则表达式:如果地址是“伦敦城”

Address (.*?) city (.*?) 

会发生什么?

+1

你不能这样试试自己吗? – Gabe

+0

试试吧..但正则表达式应该匹配'地址唐宁街城市伦敦市'正确,因为你使捕获“非贪婪”。 – Thilo

+0

OTOH,这不会工作我认为:'地址25市政厅城市纽约' – Thilo

这取决于你的reex引擎是否处于贪婪模式。

如果它处于贪婪模式,它将按预期工作,因为它会查找最长匹配。

无论您的特定正则表达式引擎在贪婪模式默认运行,还是它甚至贪婪的模式,是不是我们可以告诉你,基于问题提供的信息。

如果您使用.NET,this page对贪婪与惰性匹配有一个描述。

基本上,给出的串XYZZY,正则表达式X.*Y将匹配XYZZY(贪婪),而X.*?Y将匹配XY(懒惰)。

你需要的是一个方法,以确保您可以在分隔符和您的字符串的内容区分开来,否则你就惨了,不管是什么,比如有:

Address The city baths city Manchester city, England 

也许你可以考虑是这样的:

Address "put address here" city "put city here" 

,并尝试以确保您永远不会与它的报价得到一个城市的名字。但是,要小心。我曾经参与过一个项目,通过只需存储字母字符,我们就可以在城市名称上获得体面的压缩(它嵌入了每个字节的计数)。

此后不久,我们在全国范围内推出,A1 mining settlement的居民对我们的短视颇为恼火:-)在整个奥兹的一个城镇,名字中有一个数字,谁会想到?

或者,把地址和城市在不同的行这样的:

Address: The city baths 
City: Manchester city, England 

那么你可以看看喜欢的事情:

^Address:\s*(.*)$ 
^City:\s*(.*)$ 
+0

我使用.NET ..什么是贪婪模式? –

+0

*之后的问号应该放入非贪婪模式。 – Thilo

+0

无论贪婪模式如何,我认为你可以构建无法解析的案例。 “城市”是一个错误的分隔符,因为它可能出现在两个令牌中。 – Thilo