断言

基本概念:

断言分为两种

  1. 零宽先行断言

    1. 正向先行断言 用exp2(?=exp1) 来校验出右边 exp1exp2
    2. 负向先行断言 用exp2(?!exp1) 来校验出右边不是 exp1exp2
  2. 零宽负向断言

    1. 正向后行断言 用 (?<=exp1)exp2 来校验出左边 exp1exp2
    2. 负向后行断言 用 (?<!exp1)exp2 来校验出左边不是 exp1exp2

详解:

何为 零宽 ?

在先行断言和后行断言中,它们只匹配某些位置,在匹配过程中,不占用字符,所以被称为"零宽"。所谓位置,是指字符串中(每行)第一个字符的左边、最后一个字符的右边以及相邻字符的中间(假设文字方向是头左尾右)。

图中,红色标出指针所有隐性位置,蓝色表示这里并不存在隐性位置

所有隐性位置

所有隐性位置

可以发现只有一行字符串的最尾不存在隐性位置。

断言的匹配过程:

先根据断言将指针移动到符合条件的隐性位置,然后开始匹配字符串。

红色笔迹,为指针指向的隐性位置

首先根据断言判断指针的位置。若为(?=exp) ,则正向断言会使指针指向右边为exp的隐性位置。

正向断言指针指向

正向断言指针指向

之后才会根据指针所在位置进行对应的匹配。

若为.(?=exp) 则会匹配指针位置的左侧的第一个字符。

正向断言指针匹配

正向断言指针匹配

只有i被匹配到了。

若为(?=exp). 则会匹配指针位置的右侧的第一个字符。

正向断言指针匹配

正向断言指针匹配

同理,则反向断言(?<=exp) 会使指针指向左边为exp的隐性位置。

反向断言指针指向

反向断言指针指向

若为.(?<=exp) 则会匹配指针位置的左侧的第一个字符。

正向断言指针匹配

正向断言指针匹配

若为(?<=exp). 则会匹配指针位置的右侧的第一个字符。

正向断言指针匹配

正向断言指针匹配

最后修改:2022 年 09 月 01 日
如果觉得我的文章对你有用,请随意赞赏