正则表达式 - 重复捕获组

Jor*_*vis 8 javascript regex capture-group

我试图找出如何comma-separated在以下url字符串中的值上重复捕获组:

id=1,2;name=user1,user2,user3;city=Oakland,San Francisco,Seattle;zip=94553,94523;

我正在使用这RegExp是我想要的返回结果,除了值,因为它们是动态的,即.可能是url参数中的2,3,4等用户,并且想知道我是否可以为每个值而不是一个捕获组创建user1,user2,user3捕获组.

正则表达式: (^|;|:)(\w+)=([^;]+)*

这是使用RegExp在线的现场演示

示例输出:

  • 第1组 - (分号,冒号)
  • Group2 - (密钥即.id,名称,城市,邮编)
  • Group3 - (value1)
  • Group4 - (value2)*如果存在
  • Group5 - (value3)*如果存在
  • Group6 - (value4)*如果存在

等...基于我之前解释过的动态值.

问题:我的表达式错误我正在使用*循环来重复模式?

Pet*_*r G 12

正则表达式不支持您尝试做的事情.当引擎第二次进入捕获组时,它会覆盖第一次捕获的内容.考虑一个简单的例子(感谢regular-expressions.info):/(abc|123)+/用于'abc123'.它将匹配"abc"然后看到加号并重试,匹配"123".输出中的最终捕获组将为"123".

无论您尝试何种模式,这种情况都会发生,您设置的任何限制只会在正则表达式接受字符串时发生变化.考虑/(abc|123){2}/.这接受'abc123',捕获组为"123"但不是'abc123abc'.将捕获组放入另一组也不起作用.创建捕获组时,就像创建变量一样.它只能有一个值,后续值会覆盖前一个值.你永远不会有比拥有括号对更多的捕获组(尽管如此,你肯定会有更少的捕获组).

一个可能的解决方法是将字符串拆分为';',然后将每个字符串分别放在'='上,然后分别放在'''上的字符串右侧.那会得到你[['id', '1', '2'], ['name', 'user1', ...], ['city', ...], ['zip', ...]].

那就是:

function (str) {
  var afterSplit = str.split(';|:');
  afterSplit.pop() // final semicolon creates empty string
  for (var i = 0; i < afterSplit.length; i++) {
    afterSplit[i] = afterSplit[i].split('=');
    afterSplit[i][1] = afterSplit[i][1].split(','); // optionally, you can flatten the array from here to get something nicer
  }
  return afterSplit;
}
Run Code Online (Sandbox Code Playgroud)