如何多次捕获相同的捕获组?

时间:2017-02-15 12:27:16

标签: javascript regex

我想在网址查询中使用正则表达式捕获每个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:我认为以前一定要问过这个问题,但我找不到任何问题,但也许是因为我不知道措辞。

1 个答案:

答案 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('&'));