?=
引子:exp1(?=exp2) 查找exp2前面的exp1 //前瞻
例1:(?=456) 匹配一个位置,这个位置后面跟了456
例2:123(?=456) 会匹配123456中的123,而不会匹配123457中的123,只匹配123后面的456并不会被占用掉
例3:123456匹配的是123456,而123(?=456)456同样匹配123456,后面加了(?=456)其实是没什么意义
/***********************************************/
?<=
引子:(?<=exp2)exp1 查找exp2后面的exp1 //后顾
例子:"中国人".replace(/(?<=中国)人/, "rr") // 匹配中国人中的人,将其替换为rr,结果为 中国rr
例子:"法国人".replace(/(?<=中国)人/, "rr") // 结果为法国人,因为人前面不是中国,所以无法匹配到
/************************************************/
?!
exp1(?!exp2) 查找后面不是exp2的exp1 //负前瞻
/***********************************************/
?<!
(?<!exp2)exp1 查找前面不是exp2的exp1 //负后顾
/***********************************************/
?:
引子:
()表示捕获分组,()会把每个分组里的匹配的值保存起来,使用$n(n是一个数字,表示第n个捕获组的内容)
(?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来
https://blog.youkuaiyun.com/csm0912/article/details/81206848