为什么我的正则表达式捕获组只在匹配多个部分时捕获字符串的最后一部分

Why is my regex capture group only capturing the last part of the string when it matches multiple parts?

本文关键字:分时 个部 字符串 一部分 最后 正则表达式 我的 为什么      更新时间:2023-09-26

我尝试过的

var test = "asdfdas ABCD EFGH";
var regex = /^'S+( [A-Z]{4})+$/; 
    // Also tried: /^'S+( [A-Z]{4})+$/g
    // And: /^'S+( [A-Z]{4})+?$/g
var matches = test.match(regex);

我做了一个JSFiddle。

我的期望

变量matches应变为以下数组:

[
  "asdfdas ABCD EFGH",
  " ABCD",
  " EFGH"
]

我得到什么

变量matches实际上是这个数组:

[
  "asdfdas ABCD EFGH",
  " EFGH"
]

我的想法

我的猜测是,捕获组和/或$逻辑缺少一些东西。任何帮助将不胜感激。(我知道我可以弄清楚如何在多个正则表达式中做到这一点,但我想了解这里发生了什么。

是的,这正是它的作用;你没有做错任何事。当一个组被赋予一个量词时,它只捕获它的最后一个匹配项,这就是它在 JavaScript 中所做的一切。一般解决方法是使用多个正则表达式,如您所说,例如

var test = "asdfdas ABCD EFGH";
var match = test.match(/^'S+((?: [A-Z]{4})+)$/); // capture all repetitions
var matches = match[1].match(/ [A-Z]{4}/g); // match again to get individual ones