正则表达式 - 重复捕获组

Regex - Repeating Capturing Group

我想弄清楚如何在以下 url 字符串中的 comma-separated 值上重复捕获组:

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

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

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

这是使用 RegExp

的在线现场演示

示例输出:

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

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

正则表达式不支持您尝试执行的操作。当引擎第二次进入捕获组时,它会覆盖第一次捕获的内容。考虑一个简单的例子(感谢 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;
}

重复捕获组

字符串:!abc123def! 正则表达式:/!((abc|123|def)+)!/

匹配项:

第 1 组:abc123def

第 2 组:def

来源:https://www.regular-expressions.info/captureall.html