(?:)表示不存储匹配的值
假如我们要在字符串中查找两个重复的单词,比如"123abcdefabc456"
let str = '123abcdefabc456';
let reg = /(\w+).*?\1/;
str.match(reg); // ['abcdefabc', 'abc']
此时,(\w+) 匹配的是第一个 'abc' ,而 \1 代表前面的(\w+)
如果我们对 \w+ 使用 ?: 标记,表示不存储 \w+的值,那么\1就没有对应的匹配,所以不能匹配到值
reg=/(?:\w+).*?\1/
str.match(reg) // null
再举一个例子,我们要在字符串中查找'abcde'或者'abcfg'
reg=/abc(de|fg)/g
str='abcde12abcfg'
console.log(...str.matchAll(reg))
// ['abcde', 'de'] ['abcfg', 'fg']
可以看到结果集里面出现了'de'和'fg'
如果使用?:
reg=/abc(?:de|fg)/g
console.log(...str.matchAll(reg))
// ['abcde'] ['abcfg']
'de'和'fg'消失了,使用这种方式可以避免无意义的匹配
第三个例子,在正则分割字符串为数组的时候,可以使用/(?:)/来分隔单个字符
assert.deepEqual("
标签:abc,匹配,正则表达式,de,str,fg,reg
From: https://www.cnblogs.com/Bin-x/p/16718474.html