我正在尝试解析由以key &或value分隔的key = value对组成的url编码的字符串&。
&
&
以下将仅匹配第一个匹配项,将键和值拆分为单独的结果元素:
var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/)
字符串‘1111342 = Adam%20Franco&348572 = Bob%20Jones’的结果将是:
['1111342', 'Adam%20Franco']
使用全局标志’g’将匹配所有匹配项,但仅返回完全匹配的子字符串,而不返回单独的键和值:
var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/g)
['1111342=Adam%20Franco', '&348572=Bob%20Jones']
尽管我可以将字符串分割开来&并分别拆分每个键/值对,但有没有办法使用JavaScript的正则表达式支持来匹配/(?:&|&)?([^=]+)=([^&]+)/与PHPpreg_match_all()函数相似的模式的多次出现?
/(?:&|&)?([^=]+)=([^&]+)/
preg_match_all()
我的目标是通过一些子匹配来获得结果,例如:
[['1111342', '348572'], ['Adam%20Franco', 'Bob%20Jones']]
or
[['1111342', 'Adam%20Franco'], ['348572', 'Bob%20Jones']]
从评论中悬挂
2020评论:现在,我们不再使用regex,而是URLSearchParams为我们完成了所有这些工作,因此不再需要自定义代码,更不用说regex了。
URLSearchParams
我建议使用另一种正则表达式,使用子组分别捕获参数的名称和值:
function getUrlParams(url) { var re = /(?:\?|&(?:amp;)?)([^=&#]+)(?:=?([^&#]*))/g, match, params = {}, decode = function (s) {return decodeURIComponent(s.replace(/\+/g, " "));}; if (typeof url == "undefined") url = document.location.href; while (match = re.exec(url)) { params[decode(match[1])] = decode(match[2]); } return params; } var result = getUrlParams("http://maps.google.de/maps?f=q&source=s_q&hl=de&geocode=&q=Frankfurt+am+Main&sll=50.106047,8.679886&sspn=0.370369,0.833588&ie=UTF8&ll=50.116616,8.680573&spn=0.35972,0.833588&z=11&iwloc=addr");
result 是一个对象:
result
{ f: "q" geocode: "" hl: "de" ie: "UTF8" iwloc: "addr" ll: "50.116616,8.680573" q: "Frankfurt am Main" sll: "50.106047,8.679886" source: "s_q" spn: "0.35972,0.833588" sspn: "0.370369,0.833588" z: "11" }
正则表达式分解如下:
(?: # non-capturing group \?|& # "?" or "&" (?:amp;)? # (allow "&", for wrongly HTML-encoded URLs) ) # end non-capturing group ( # group 1 [^=&#]+ # any character except "=", "&" or "#"; at least once ) # end group 1 - this will be the parameter's name (?: # non-capturing group =? # an "=", optional ( # group 2 [^&#]* # any character except "&" or "#"; any number of times ) # end group 2 - this will be the parameter's value ) # end non-capturing group