javascript中的正则的"?:"是什么意思,捕获组是什么意思

JavaScript08

javascript中的正则的"?:"是什么意思,捕获组是什么意思,第1张

首先明确一下正则中括号的用途:

表明一个子整体;

这个子整体可被引用。

以上两条是同时生效的,如果只想表示一个整体,而不生成一个可被引用的整体,就带个?:,如(?:xxx).

例子:

var str = 'Good morning'

var pattern = /(\w)o(\w)/g

if( pattern.test(str) ){

    console.log( RegExp.$1 , RegExp.$2 )//匹配到了G和o

} var str = 'Good morning'

var pattern = /(?:\w)o(\w)/g

if( pattern.test(str) ){

    console.log( RegExp.$1 , RegExp.$2 )//只匹配到了第一个o后的o,$2没匹配到值,因为只有一个括号是可以被引用的。

}

如"((a)(b)) c":引用捕获语法:用反斜杠+第几捕获,0是整个结果,括号的捕获从1开始算,顺序以左括号顺序为准,上面中 \0=abc,\1=ab,\2=a,\3=b

因此如"(a)(b)\1\1\2" 将匹配"abaab"

前瞻:"ab(?=c)",匹配abcd中的ab,不匹配abd中的ab。c不被匹配,只是要求匹配的ab后面必须是c

负前瞻:"ab(?!c)",类似。要求匹配的ab后面不能有c,即与上面相反

后顾:"(?<=c)ab",类似。要求ab前有c

负后顾:"(?<!c)ab",类似。要求ab前没有c

visual studio/visual studio code的ctrl+h替换中,若替换内容使用捕获组,用美元符号'$'代替反斜杠''。其次,它不支持后顾,只有前瞻

即作正则时,正则处理中会再转义一次,算上默认的作字符串时的转义,一共把你的输入转义两次。