首先明确一下正则中括号的用途:
表明一个子整体;
这个子整体可被引用。
以上两条是同时生效的,如果只想表示一个整体,而不生成一个可被引用的整体,就带个?:,如(?: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替换中,若替换内容使用捕获组,用美元符号'$'代替反斜杠''。其次,它不支持后顾,只有前瞻
即作正则时,正则处理中会再转义一次,算上默认的作字符串时的转义,一共把你的输入转义两次。