我想在网址查询中使用正则表达式捕获每个name=value
对。
假设我有这样的疑问:
?lm=1403085628
?lm=1403085628&other=343323
?lm=1403085628&other=&second=34342
?lm=1403085628&=343243&second=34342
?lm=1403085628&other=343323&some=efsfs
?
?lm=1403085628&other=343323&&&wrong
如果我尝试this:^\?(?:([a-zA-Z0-9-_]+\=[a-zA-Z0-9-_]+)&?)*
这仅捕获最后一次出现,例如第三次出现some=efsfs
。
但我想要的是一系列键值对,如下所示:
[
'lm=1403085628',
'other=',
'second=34342'
]
如何捕获所有出现的捕获组?
PS:我认为以前一定要问过这个问题,但我找不到任何问题,但也许是因为我不知道措辞。答案 0 :(得分:1)
怎么样
var regex = /(?:[?&](.*?)=([^?&]+))/g
regex.exec(inputQuery);
这将以这种方式返回值:
["?lm=1403085628", "lm", "1403085628"]
索引0是匹配,索引1是名称,索引2是值。如果您在循环中执行此操作,则可以立即捕获名称和值
var result;
var values = [];
do {
values.push(result);
} while(result = regex.exec(queryInput))
或者(没有正则表达式,效率更高),您可以使用:
'?lm=1403085628&other=&second=34342'.slice(1).split('&')
// Results in : ["lm=1403085628", "other=", "second=34342"]
编辑:JsFiddle演示切片/分割方法
console.log('?lm=1403085628'.slice(1).split('&'));
console.log('?lm=1403085628&other=343323'.slice(1).split('&'));
console.log('?lm=1403085628&other=&second=34342'.slice(1).split('&'));
console.log('?lm=1403085628&=343243&second=34342'.slice(1).split('&'));
console.log('?lm=1403085628&other=343323&some=efsfs'.slice(1).split('&'));
console.log('?'.slice(1).split('&'));
console.log('?lm=1403085628&other=343323&&&wrong'.slice(1).split('&'));