JS Regex多个捕获组返回所有匹配项

时间:2017-11-22 11:39:09

标签: javascript regex

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

have right now

/^[^:]+:(?:([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 个答案:

答案 0 :(得分:1)

您可能无法获得任意数量的组,其数量由模式中的捕获组数量指定。您可以将- - 分隔的值匹配并捕获到1个组中,然后将其与-分开以获取单个项目并动态构建结果:



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]+)*) - 第1组(它将是abc-def-ghij ...):一个或多个字母后跟0个连续的-和1+个字母序列(添加{{1修饰符使模式不区分大小写)
  • /i - 第2组(它可以只是"推送到#{1}}生成的数组中):1位或更多位数或([\d.]+)
  • m[2] - 字符串结束。