JS正则表达式多个捕获组返回所有匹配结果

3
我将尝试创建一个正则表达式来从字符串中提取数据。我的示例字符串:dn1:pts-sc1.1。我期望的数据格式是:['pts','sc','1.1'],基本上是在之后的每组字母和末尾的数字。

目前我拥有的是:

/^[^:]+:(?:([a-z]+)-?)+([\d\.]+)$/g

很遗憾,它只返回最后一组字母。['sc', '1.1'] 我还尝试在第一个捕获组中添加+

/^[^:]+:(?:([a-z]+)+-?)+([\d\.]+)$/g

结果相同。唯一的区别是regex101给了我这个评论:

重复捕获组只会捕获最后一次迭代。在重复组周围放置一个捕获组以捕获所有迭代,或者如果您不关心数据,则使用非捕获组。

--编辑

输入字符串示例:

  • dn2.33:sc-pts-tt-as3.43
  • dn2.33:sc3.43
  • dn2.33:sc-tt-as3.43
基本上,我不知道字母组的数量。

1
你可能无法获得任意数量的组,它们的数量由模式中捕获组的数量指定。为什么不使用/^[^:]+:([a-z]+)-([a-z]+)([\d.]+)$/呢? - Wiktor Stribiżew
@WiktorStribiżew 我在编辑中添加了一些额外的信息。 - Quba
1个回答

3

您可能无法获得任意数量的分组,其数量由模式中捕获组的数量指定。相反,您可以将-分隔值匹配和捕获到一个组中,然后使用-进行拆分以获取单个项目并动态构建结果:

var strs = ['dn2.33:sc-pts-tt-as3.43','dn2.33:sc3.43','dn2.33:sc-tt-as3.43'];
var rx = /^[^:]+:([a-z]+(?:-[a-z]+)*)([\d.]+)$/; // Define the regex
for (var s of strs) {
  var res = [];             // The resulting array variable
  var m = rx.exec(s);       // Run the regex search
  if (m) {                  // If there is a match...
    res = m[1].split('-');  // Split Group 1 value with - and assign to res
    res.push(m[2]);         // Add Group 2 value to the resulting array
  }
  console.log(s, "=>", res);
}

这个模式 - ^[^:]+:([a-z]+(?:-[a-z]+)*)([\d.]+)$ - 可以匹配以下内容:

  • ^ - 字符串的开头
  • [^:]+ - 除了:之外的1个或多个字符
  • : - 冒号
  • ([a-z]+(?:-[a-z]+)*) - 第一组(它将是abc-def-ghij...):1个或多个字母,后跟0个或多个连续的-和1个以上的字母(添加/i修饰符使模式不区分大小写)
  • ([\d.]+) - 第二组(它可以被直接添加到结果数组中作为m[2]):1个或多个数字或.
  • $ - 字符串的结尾。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接