Java 正则?:?=?!的理解
上图是官方文档的介绍,总结一下讲了两个知识点 ①是否获取匹配并保存匹配的值、②正向预查和反向预查。 1:解释是否获取匹配并保存匹配的值 ()表示捕获分组,获取匹配,() 把每个分组里的匹配的值保存起来 (?:)表示非捕获分组,获取匹配,非捕获分组匹配的值不会保存起来,可以提高程序执行速度 (?=?!?<=?<!)表示非捕获分组,不获取匹配,也不保存匹配的值 举例说明: // 是否获取匹配 测试文本 abxoxcd ..(xox).. 匹配 abxoxcd ..(?:xox).. 匹配 abxoxcd ..(?=xox).. 匹配 abxo获取匹配,一般匹配到了字符之后,该字符就被消耗、输出。不获取匹配,不会消耗字符。 // 是否保存匹配的值 测试文本 AAABBCaaA E666FF (A)\\1* 匹配 AAA、A (\\w)\\1+ 匹配 AAA、BB、aa、666、FF (?:A)(B)\\1* 匹配 ABB因为非捕获分组不保存匹配的值,所以 (?:A)(B)\\1* 匹配 ABB 第一个\\1表示(B)这个捕获组捕获到的值。 “注意:反向引用表示捕获到的值,而不是再次使用正则表达式”这里用到了一个新的知识点,反向引用。 1、正则表达式中 “\number” 表示反向引用,表示引用一个捕获组,需要和小括号 “()” 一起使用 2、正则捕获组的下标从 0 开始,下标为 0