高级正则表达式来处理部分法语地址

时间:2013-04-27 15:49:36

标签: javascript regex

我的意见是:“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"]

3 个答案:

答案 0 :(得分:4)

在第一次捕捉中,只需将贪婪的.*转换为非贪婪的.*?

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

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

答案 1 :(得分: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;
//                                         ^

获得理想的结果。

答案 2 :(得分:0)

捕捉城市非贪婪:

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