2011-11-24 127 views
0

假設我有這個字符串:避免重複文字

Address XXXXX city XXXXX 

而這正則表達式:如果地址是「倫敦城」

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

會發生什麼?

+1

你不能這樣試試自己嗎? – Gabe

+0

試試吧..但正則表達式應該匹配'地址唐寧街城市倫敦市'正確,因爲你使捕獲「非貪婪」。 – Thilo

+0

OTOH,這不會工作我認爲:'地址25市政廳城市紐約' – Thilo

回答

1

這取決於你的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