2

我的输入是这样的:“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

3 回答 3

4

只需在第一次捕获中将贪婪转换.*为非贪婪即可。.*?

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

正在发生的事情.*是捕获太多并且也在捕获“cedex 120”。

于 2013-04-27T15:53:04.823 回答
4

使CEDEX组非可选

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

或使.*重复不贪婪

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

得到想要的结果。

于 2013-04-27T15:54:52.433 回答
0

使城市的捕获不贪婪:

var parseZipCityAndCountryRe = /(\d+)\s+(.+?)\s*(cedex \d+)? - (\w+)/i;
于 2013-04-27T15:57:08.230 回答