javascript - 如何多次捕获同一个捕获组?

标签 javascript regex

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

最佳答案

怎么样

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

关于javascript - 如何多次捕获同一个捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42249423/

相关文章:

javascript - 如何在 nodejs 中的 async.each 中进行同步 http 调用

javascript - 滚动条在 Internet Explorer 10 中显示不正确

javascript - JS regex positive look behind * 应该什么时候不贪心?

java - 正则表达式:如果我想在给定模式中找到 "\"和 "s",我需要做什么?

objective-c - 单独 key :value-string to NSDictionary

javascript - 匹配包含特定字符串的任何单词

javascript - res.json() 不存在

javascript - CSS 右对齐被推到新行

php - CakePHP 1.3 : Protect Forms From XSS

regex - 如何获取我的regex方法以返回所有路径匹配项?