我的输入是这样的:“78003凡尔赛CEDEX 3-法国”。这里的邮政编码是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"]

最佳答案

使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;
//                                         ^

获得理想的结果。

10-08 15:34