正则表达式 - 重复捕获组

时间:2017-04-17 23:50:01

标签: javascript regex capture-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创建一个捕获组作为一个捕获组。

RegExp: (^|;|:)(\w+)=([^;]+)*

以下是使用 RegExp

在线的实时演示

示例输出:

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

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

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

2 个答案:

答案 0 :(得分:9)

正则表达式不支持您尝试做的事情。当引擎第二次进入捕获组时,它会覆盖第一次捕获的内容。考虑一个简单的示例(感谢regular-expressions.info):<?php echo date("d-m-Y",strtotime('04/16/2017')); ?> 上使用/(abc|123)+/。它将匹配“abc”然后查看加号并再次尝试,匹配“123”。输出中的最终捕获组将为“123”。

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

然后可能的解决方法是将字符串拆分为';',然后将每个字符串拆分为'=',然后将其分别放在','上。这会让你/(abc|123){2}/

这就是:

[['id', '1', '2'], ['name', 'user1', ...], ['city', ...], ['zip', ...]]

答案 1 :(得分:0)

重复捕获组

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

匹配项:

第1组:abc123def

第2组:防御

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