繁体   English   中英

正则表达式 - 重复捕获组

[英]Regex - Repeating Capturing Group

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

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) *如果存在

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM