在使用正则表达式时,有时我们需要捕获的内容前后必须是特定内容,但又不捕获这些特定内容的时候,零宽断言就起到作用了。
零宽断言正如它的名字一样,是一种零宽度的匹配,它最终匹配结果只是一个位置而已。
零宽断言有正向(positive)、负向(negative)、先行(lookahead)、后行(lookbehind),一共有4种组合形式:
- (?=exp) 零宽正向先行断言(zero-width positive lookahead assertion)
- (?<=exp) 零宽正向后行断言(zero-width positive lookbehind assertion)
- (?!exp) 零宽负向先行断言(zero-width negative lookahead assertion)
- (?<!exp) 零宽负向后行断言(zero-width negative lookbehind assertion)
这里面的exp是一个正则表达式。
(1)先行(lookahead) & 后行(lookbehind)
先行断言,是当扫描指针位于某处时,引擎会尝试匹配指针还未扫过的字符,先于指针到达该字符,故称为先行。
后行断言,引擎会尝试匹配指针已扫过的字符,后于指针到达该字符,故称为后行。
(2)正向(positive)和负向(negative)
正向就表示匹配括号中的表达式,负向表示不匹配。
(3)表达式详解
eg.:(?<=exp)
-
?
表示零宽; -
reg
表示这个宽度为零的(边界)的表达式; -
<
箭头向后,就是lookbehind;没有箭头,默认为正向lookahead; -
=
等于,就是匹配,positive;!
不等于就是不匹配,negative;
操作符 | 说明 | 实例 |
---|---|---|
(?=exp) |
正向先行断言,代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配exp |
re(?=gular) a regular expression这个字符串,匹配regular中的re,但不会匹配expression中的re |
(?<=exp ) |
正向后行断言,代表字符串中的一个位置,紧接该位置之前的字符序列能够匹配exp | |
(?!exp) |
负向先行断言,代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配exp | |
(?<!exp) |
负向后行断言,代表字符串中的一个位置,紧接该位置之前的字符序列不能匹配exp |
网友评论