我无法让我的正则表达式匹配所有组。
我的正则表达式:/^#(\\|?[^|]+\\|[^|]+\\|?)+?$/g
测试字符串:#something|somethingelse|morestuff|evenmorestuff
我想要的匹配是成对匹配的内容,例如:something|somethingelse
和morestuff|evenmorestuff
应该是第1组和第2组。但我只能返回最后一组。
我的代码看起来像这样(我正在使用Javascript)。
re = new RegExp('^#(\\|?[^|]+\\|[^|]+\\|?)+?$', 'g');
var matches = re.exec(window.location.hash);
console.log([matches[0], matches[1], matches[2]]);
matches[0]
返回整个字符串
matches[1]
返回morestuff|evenmorestuff
matches[2]
未定义。
答案 0 :(得分:1)
您的正则表达式是repeated capturing group工作原理的示例:(ab)+
仅捕获ab
字符串中abababab
的最后一次出现。
在您的情况下,您可以执行两个步骤:1)验证输入字符串以确保它遵循您想要的模式,2)使用基于g
的正则表达式从字符串中提取部分。
验证您可以使用的字符串
/^#[^|]+\|[^|]+(?:\|[^|]+\|[^|]+)*$/
请参阅regex demo。它基本上是你的原始正则表达式,但它更高效,没有捕获组(我们在这一步不需要它们),并且它不允许|
在字符串的开头/结尾(但你可以添加\|*
#
之后$
^#
如果您需要{。}}。
<强>详情
#
- [^|]+
位于字符串的开头|
- 除\|
以外的1个字符|
- [^|]+
|
- 除(?:\|[^|]+\|[^|]+)*
以外的1个字符\|
- 0+序列
|
- [^|]+\|[^|]+
字符|
- |
以外的1 +个字符,|
以及$
以外的1 +个字符var s = "#something|somethingelse|morestuff|evenmorestuff";
var rx_validate = /^#[^|]+\|[^|]+(?:\|[^|]+\|[^|]+)*$/;
var rx_extract = /([^|]+)\|([^|]+)/g;
var m, result = [];
if (rx_validate.test(s)) {
while (m=rx_extract.exec(s.substr(1))) {
result.push([m[1], m[2]]);
}
}
console.log(result);
// or just pairs as strings
// console.log(s.substr(1).match(rx_extract));
// => [ "something|somethingelse", "morestuff|evenmorestuff" ]
- 字符串结束。要提取对,您可以使用简单的/([^|]+)\|([^|]+)/
正则表达式(输入将是从位置1开始的子字符串)。
整个解决方案:
objectCount != 0
&#13;