15

我试图弄清楚如何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在线进行的现场演示

示例输出:

  • Group1 -(分号,冒号)
  • Group2 - (key ie. id,name,city,zip)
  • 组 3 -(值 1)
  • Group4 - (value2) *如果存在
  • Group5 - (value3) *如果存在
  • Group6 - (value4) *如果存在

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

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

4

2 回答 2

21

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

无论您尝试什么模式,当正则表达式接受字符串时,您设置的任何限制都会发生这种情况。考虑/(abc|123){2}/。这接受捕获组为“123”的“abc123”,但不接受“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;
}
于 2017-04-18T04:42:26.390 回答
1

重复捕获组

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

比赛:

第 1 组:abc123def

第 2 组:定义

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

于 2019-11-28T21:02:39.580 回答