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