参考文档:https://www.cnblogs.com/pan1042/p/12121382.html 写的不错
该表达式的主要的作用有两个,
1. 获取匹配并保存其值
2. 正向预查或反向预查
1. 解释是否获取匹配并保存匹配的值
() 表示获取分组,获取匹配,把每个分组中匹配到的值都保存起来。
(?:) 表示非捕获分组,获取匹配,匹配的值不会保存起来
(?!) 不获取匹配,也不会保存
自测结果如下