断言
基本概念:
断言分为两种
零宽先行断言
- 正向先行断言 用exp2(?=exp1) 来校验出右边是 exp1 的 exp2
- 负向先行断言 用exp2(?!exp1) 来校验出右边不是 exp1 的 exp2
零宽负向断言
- 正向后行断言 用 (?<=exp1)exp2 来校验出左边是 exp1 的 exp2
- 负向后行断言 用 (?<!exp1)exp2 来校验出左边不是 exp1 的 exp2
详解:
何为 零宽 ?
在先行断言和后行断言中,它们只匹配某些位置,在匹配过程中,不占用字符,所以被称为"零宽"。所谓位置,是指字符串中(每行)第一个字符的左边、最后一个字符的右边以及相邻字符的中间(假设文字方向是头左尾右)。
图中,红色标出指针所有隐性位置,蓝色表示这里并不存在隐性位置
可以发现只有一行字符串的最尾不存在隐性位置。
断言的匹配过程:
先根据断言将指针移动到符合条件的隐性位置,然后开始匹配字符串。
红色笔迹,为指针指向的隐性位置
首先根据断言判断指针的位置。若为(?=exp) ,则正向断言会使指针指向右边为exp的隐性位置。
之后才会根据指针所在位置进行对应的匹配。
若为.(?=exp)
则会匹配指针位置的左侧的第一个字符。
只有i被匹配到了。
若为(?=exp).
则会匹配指针位置的右侧的第一个字符。
同理,则反向断言(?<=exp)
会使指针指向左边为exp的隐性位置。
若为.(?<=exp)
则会匹配指针位置的左侧的第一个字符。
若为(?<=exp).
则会匹配指针位置的右侧的第一个字符。