正则表达式中的 (?:)

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

假如我们要在字符串中查找两个重复的单词,比如"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 @   Bin_x  阅读(4358)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2021-09-22 JDK安装
2021-09-22 maven安装
点击右上角即可分享
微信分享提示