JavaScript正则表达式中 ?: 是什么意思?
的有关信息介绍如下:“?:”是“非获取存储匹配”的意思
“ ?:” 只在一个“()”group中,紧贴着“(”出现,例如“(?:abcdefg)”,不同于“ ? ”, “?: ”不是一个量词,但是与“()”共同构造一个元字符,这个元字符所匹配出来的结果,不会保留,也不能参与诸如替换计算等等的操作。(这个操作在服务端多见一些,前端用的不多)(javascript只有string对象的replace方法能用到这个功能)
简单来说,就是你的正则表达式如果用不着在javascript里面使用replace方法,“?:”就可以省去(当然,看个人喜好和排版习惯,还有调试中的页面响应速度,如果加了“?:”反而更快,那就用吧)。
这么说起来还是比较抽象,用实例代码来说明吧。
将匹配的数字增加后缀“9”
/(\d+)/gi:A23G4HFD567.
点我
function myFunction(){
var e=document.getElementsByClassName("demo");
var str=e.innerHTML;
var n=str.replace(/(\d+)/gi,"$19");
str=e.innerHTML;
var n=str.replace(/(?:\d+)/gi,"$19");
}

点击“点我”按钮前

点击“点我”按钮后
可以看到“/(\d+)/gi”所匹配的结果被用于扩展替换字符串中的“$1”;
但是“/(?:\d+)/gi”所匹配的结果没有被用于扩展替换字符串中的“$1”,尽管,它也成功地找到了被查找字符串中的数字,显然结果没有被保留。
对了,类似的问题,可以用这种办法去对比验证。(比如“?=”、“?!”、“?<=”、“?

上图是在菜鸟教程找到的一个比较全面的正则表达式的元字符列表的部分:https://www.runoob.com/regexp/regexp-metachar.html
还有,不同软件的正则表达式的可能有不同的特性,但是目前perl的正则表达式是公认最多特性的。



