我正在试图弄清楚如何在以下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
在线的实时演示示例输出:
等......基于我之前解释过的动态值。
问题:我的表达方式出了什么问题我正在使用 *
来循环重复模式?
答案 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组:防御