正则表达式中的 (?:)

(?:)表示不存储匹配的值

假如我们要在字符串中查找两个重复的单词,比如"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("😄😄".split(/(?:)/u), ["😄", "😄"]);

 

posted @ 2022-09-22 10:59  Bin_x  阅读(4647)  评论(0)    收藏  举报