在Javascript中匹配多个正则表达式组

时间:2018-03-24 20:02:22

标签: javascript regex

我无法让我的正则表达式匹配所有组。

我的正则表达式:/^#(\\|?[^|]+\\|[^|]+\\|?)+?$/g

测试字符串:#something|somethingelse|morestuff|evenmorestuff

我想要的匹配是成对匹配的内容,例如:something|somethingelsemorestuff|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]未定义。

1 个答案:

答案 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开始的子字符串)。

整个解决方案:

&#13;
&#13;
objectCount != 0
&#13;
&#13;
&#13;