[英]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在线进行的现场演示
示例输出:
等等...基于我之前解释的动态值。
问题:我的表达式有什么问题我使用*
来循环重复模式?
正则表达式不支持您尝试执行的操作。 当引擎第二次进入捕获组时,它会覆盖第一次捕获的内容。 考虑一个简单的例子(感谢正则表达式.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 组:定义
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.