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"]`
会影响结果?毕竟,我们只是在寻找重复的、非重叠的两个字符$
- 为什么将内部组更改为未捕获组会导致产生不同的结果:
AFAIK-捕获的组用于反向引用和捕获组。毕竟,这仍然是一组重复的两个字符,那么在这种特殊情况下,'031745'.split(/(?=(..)$)/); // result: ["0317", "45", "45"]
的行为与(…)
的行为有何不同呢(?:…)
$
确保字符串的结尾在两个字符重复一定次数后出现。否则,split
打开的位置将是后面至少有两个字符的任何位置-即每个位置(字符串末尾之前除外)。因此,需要使用$
来正确地分块字符串。当某个位置和字符串结尾之间有奇数个字符时,您希望正则表达式失败,以便(例如)不拆分字符0和1,不拆分字符2和3,依此类推
为什么将内部组更改为非捕获组会导致产生不同的结果
当您在split
中使用捕获组时,捕获的内容将作为附加项包含在结果数组中,除了字符串的split
前后部分之外。例如:
console.log('foobar'.split(/(bar)/)
有时match
较短:'031745'。match(/../g)
@NinaScholz Yes。的确只是用正则表达式进行拆分也是一种选择,我被它击中了——两次!我不喜欢在不知道为什么的情况下被击中。结束符号是防止分割每个角色所必需的,因为只有最后两个角色被一起处理。对于前面的所有字符,两个字符的分组对于正则表达式不可见。(由于组的定义长度,taht使匹配更容易)。@WiktorStribiżew我同意这些是基本运算符。但是在这种情况下,我发现很难解释$
(结束字符)是如何影响结果的。没有必要因为不同的意见而否决投票。作为一个问题,这个问题没有错。@WiktorStribiżew如果你看一下,你会发现我很清楚那些操作符是做什么的。说你认为我在问“辅导问题”是不礼貌的。对你来说这是一个简单的答案,并不意味着对我来说这是一个简单的答案。你不能对别人说他们的问题是教程级的,因为这对你来说很容易。这不是所谓的精神。