今天在群里看到有人提问,问匹配catdog里的dog时为什么要用(?<=cat)dog而不是(?=cat)dog,这就要从正则匹配的机制讲起了。
正则表达式查找顺序是自作向右的,所以我们把这个顺序称为向前看,对于表达式(?<=cat)dog匹配catdog,它经历了以下步骤:
1.先定位到c,然后回退三个字符看是否是cat,显然,这里c作为第一个字符无法回退,则继续按此步骤向下查询。
2.查询至d时回退三个字符满足cat,则依次向下匹配,满足dog,匹配成功。
当了解了匹配机制时,也就不难理解为什么要用(?<=cat)dog而不是(?=cat)dog,后者的存在本身就是一个悖论。
这里做个总结:
(?=)表示查询方向是向前看,举个例子来说就是cat(?=dog)匹配catdog里的cat。
(?<=)表示查询方向是向后看,也就是定位之后要回退。