Javascript 重复时未捕获的组角色?

Javascript 重复时未捕获的组角色?,javascript,regex,Javascript,Regex,我的任务是把一个字符串分成两个字符组 所以'031745'→ [03,17,45] 我采用了regex方法,并通过以下方式成功地做到了这一点: '031745'.split(/(?=(?:..)+$)/); // result: ["03", "17", "45"] 我知道这里发生了什么:我们正试图通过不可见的位置进行分割,该位置有2个字符的后续组,重复 但有两件事我很难解释: 1. 如果我删除end字符$,我会得到以下结果: '031745'.split(/(?=(?:..)+)/);

我的任务是把一个字符串分成两个字符组

所以
'031745'
→ <代码>[03,17,45]

我采用了regex方法,并通过以下方式成功地做到了这一点:

'031745'.split(/(?=(?:..)+$)/);

// result: ["03", "17", "45"]
我知道这里发生了什么:我们正试图通过不可见的位置进行分割,该位置有2个字符的后续组,重复

但有两件事我很难解释:

1.

  • 如果我删除
    end
    字符
    $
    ,我会得到以下结果:

    '031745'.split(/(?=(?:..)+)/);
    // result: ["0", "3", "1", "7", "45"]`
    
    为什么删除
    $
    会影响结果?毕竟,我们只是在寻找重复的、非重叠的两个字符

2.

  • 为什么将内部组更改为未捕获组会导致产生不同的结果:

    '031745'.split(/(?=(..)$)/);
    // result: ["0317", "45", "45"]
    
    AFAIK-捕获的组用于反向引用和捕获组。毕竟,这仍然是一组重复的两个字符,那么在这种特殊情况下,
    (…)
    的行为与
    (?:…)
    的行为有何不同呢

注意,我知道还有其他方法,但我仍然想继续使用Regex-学习目的

为什么删除$会影响结果

$
确保字符串的结尾在两个字符重复一定次数后出现。否则,
split
打开的位置将是后面至少有两个字符的任何位置-即每个位置(字符串末尾之前除外)。因此,需要使用
$
来正确地分块字符串。当某个位置和字符串结尾之间有奇数个字符时,您希望正则表达式失败,以便(例如)不拆分字符0和1,不拆分字符2和3,依此类推

为什么将内部组更改为非捕获组会导致产生不同的结果

当您在
split
中使用捕获组时,捕获的内容将作为附加项包含在结果数组中,除了字符串的
split
前后部分之外。例如:


console.log('foobar'.split(/(bar)/)
有时
match
较短:
'031745'。match(/../g)
@NinaScholz Yes。的确只是用正则表达式进行拆分也是一种选择,我被它击中了——两次!我不喜欢在不知道为什么的情况下被击中。结束符号是防止分割每个角色所必需的,因为只有最后两个角色被一起处理。对于前面的所有字符,两个字符的分组对于正则表达式不可见。(由于组的定义长度,taht使匹配更容易)。@WiktorStribiżew我同意这些是基本运算符。但是在这种情况下,我发现很难解释
$
(结束字符)是如何影响结果的。没有必要因为不同的意见而否决投票。作为一个问题,这个问题没有错。@WiktorStribiżew如果你看一下,你会发现我很清楚那些操作符是做什么的。说你认为我在问“辅导问题”是不礼貌的。对你来说这是一个简单的答案,并不意味着对我来说这是一个简单的答案。你不能对别人说他们的问题是教程级的,因为这对你来说很容易。这不是所谓的精神。