2013-04-27 32 views
2

我的輸入是likethis:「78003 Versailles CEDEX 3 - France」。這裏78003是郵政編碼,凡爾賽是城市,CEDEX 3是可選部分,這意味着這是一個特殊的地址。處理部分法語地址的高級正則表達式

目前我的正則表達式獲取郵政編碼,城市和國家,但我無法獲得CEDEX部分。我想我被一個貪婪的表達所欺騙,但我不知道如何克服它。

var parseZipCityAndCountryRe = /(\d*)\s*(.*)(?:\s*CEDEX\s*(\d*))?\s*-\s*(.*)/i; 
parseZipCityAndCountryRe.exec("78003 Versailles cedex 120 - France") 

// current output 
["78003 Versailles cedex 120 - France", "78003", "Versailles cedex 120 ", undefined, "France"] 
// wished output 
["78003 Versailles cedex 120 - France", "78003", "Versailles", "120", "France"] 

回答

4

充分利用CEDEX組非可選

var parseZipCityAndCountryRe = /(\d*)\s*(.*)(?:\s*CEDEX\s*(\d*))\s*-\s*(.*)/i; 
//               ^

或使.*重複non-greedy

var parseZipCityAndCountryRe = /(\d*)\s*(.*?)(?:\s*CEDEX\s*(\d*))\s*-\s*(.*)/i; 
//          ^

,以獲得期望的結果。

+0

我不知道這個非貪婪的選項,我接受你的答案,因爲它是最完整的。謝謝 – AsTeR 2013-04-27 16:00:22

4

簡單的貪婪.*轉換爲非貪婪.*?第一捕獲。

var parseZipCityAndCountryRe = /(\d*)\s*(.*?)(?:\s*CEDEX\s*(\d*))?\s*-\s*(.*)/i; 

正在發生的事情是,.*被捕捉得太多,被捕獲「CEDEX 120」爲好。

+0

+1我不知道這是非貪婪的選項,你的感謝。 – AsTeR 2013-04-27 16:00:48

0

使全市非貪婪的捕獲:

var parseZipCityAndCountryRe = /(\d+)\s+(.+?)\s*(cedex \d+)? - (\w+)/i;