正则表达式 - 重复捕获组
Regex - Repeating Capturing Group
我想弄清楚如何在以下 url 字符串中的 comma-separated
值上重复捕获组:
id=1,2;name=user1,user2,user3;city=Oakland,San Francisco,Seattle;zip=94553,94523;
我正在使用这个 RegExp
这是我想要的 return 结果,除了值,因为它们是动态的,即。可能是 url 参数中的 2、3、4 等用户,我想知道我是否可以为每个值创建一个捕获组而不是 user1,user2,user3
作为一个捕获组。
正则表达式: (^|;|:)(\w+)=([^;]+)*
这是使用 RegExp
的在线现场演示
示例输出:
- 组 1 -(分号、冒号)
- 组 2 -(键即 ID、名称、城市、邮编)
- Group3 - (value1)
- Group4 - (value2) *如果存在
- Group5 - (value3) *如果存在
- Group6 - (value4) *如果存在
等...基于我之前解释的动态值。
问题: 我的表达式有什么问题我正在使用 *
来循环重复模式?
正则表达式不支持您尝试执行的操作。当引擎第二次进入捕获组时,它会覆盖第一次捕获的内容。考虑一个简单的例子(感谢 regular-expressions.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 组:def
我想弄清楚如何在以下 url 字符串中的 comma-separated
值上重复捕获组:
id=1,2;name=user1,user2,user3;city=Oakland,San Francisco,Seattle;zip=94553,94523;
我正在使用这个 RegExp
这是我想要的 return 结果,除了值,因为它们是动态的,即。可能是 url 参数中的 2、3、4 等用户,我想知道我是否可以为每个值创建一个捕获组而不是 user1,user2,user3
作为一个捕获组。
正则表达式: (^|;|:)(\w+)=([^;]+)*
这是使用 RegExp
的在线现场演示示例输出:
- 组 1 -(分号、冒号)
- 组 2 -(键即 ID、名称、城市、邮编)
- Group3 - (value1)
- Group4 - (value2) *如果存在
- Group5 - (value3) *如果存在
- Group6 - (value4) *如果存在
等...基于我之前解释的动态值。
问题: 我的表达式有什么问题我正在使用 *
来循环重复模式?
正则表达式不支持您尝试执行的操作。当引擎第二次进入捕获组时,它会覆盖第一次捕获的内容。考虑一个简单的例子(感谢 regular-expressions.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 组:def