先行断言(lookahead)和后行断言(lookbehind)

简介: 先行断言(lookahead)和后行断言(lookbehind)

正则表达式的先行断言后行断言一共有4种形式

格式 中文名称 英文名称
?=pattern 零宽正向先行断言 zero-width positive lookahead assertion
?!pattern 零宽负向先行断言 zero-width negative lookahead assertion
?<=pattern 零宽正向后行断言 zero-width positive lookbehind assertion
?<!pattern 零宽负向后行断言 zero-width negative lookbehind assertion


名词释义

  • 零宽zero-width
    见文知义, 零宽 表示一种零宽度的匹配,它匹配到的内容不会保存到匹配结果中去,最终匹配结果只是一个位置而已。
  • 正向(positive)和负向(negative)
    不等于( != )、逻辑非( ! )都是用 !号 来表示,所以有 !号 的形式表示不匹配、负向
    !号 换成 =号 ,就表示匹配、正向
  • 先行(lookahead)和后行(lookbehind)
    正则表达式引擎在执行字符串和表达式匹配时,会从头到尾从前到后)连续扫描字符串中的字符,设想有一个扫描指针指向字符边界处并随匹配过程移动。
    先行断言,是当扫描指针位于某处时,引擎会尝试匹配指针还未扫过的字符,先于指针到达该字符,故称为先行
    后行断言,引擎会尝试匹配指针已扫过的字符,后于指针到达该字符,故称为后行


含义

( ?=pattern ) 正向先行断言

代表字符串中的一个位置, 紧接该位置之后 的字符序列 能够匹配pattern


例如对” a regular expression ”这个字符串,要想匹配 regular 中的 re ,但不能匹配 expression 中的 re ,可以用” re(?=gular) ”,该表达式限定了 re 右边的位置,这个位置之后是 gular ,但并不消耗 gular 这些字符,将表达式改为” re(?=gular). ”,将会匹配 reg元字符. 匹配了 g ,括号这一砣匹配了 eg 之间的位置。


( ?!pattern ) 负向先行断言

代表字符串中的一个位置, 紧接该位置之后 的字符序列 不能匹配pattern


例如对” regex represents regular expression ”这个字符串,要想匹配除 regexregular 之外的 re ,可以用” re(?!g) ”,该表达式限定了 re 右边的位置,这个位置后面不是字符 g


负向和正向的区别,就在于该位置之后的字符能否匹配括号中的表达式


( ?<=pattern ) 正向后行断言

代表字符串中的一个位置, 紧接该位置之前 的字符序列 能够匹配pattern


例如对” regex represents regular expression ”这个字符串,有4个单词,要想匹配单词内部的 re ,但不匹配单词开头的 re ,可以用” (?<=\w)re ”,单词内部的 re ,在 re 前面应该是一个单词字符。


之所以叫后行断言,是因为正则表达式引擎在匹配字符串和表达式时,是从前向后逐个扫描字符串中的字符,并判断是否与表达式符合,当在表达式中遇到该断言时,正则表达式引擎需要往字符串前端检测已扫描过的字符,相对于扫描方向是向后的


(?<!pattern) 负向后行断言

代表字符串中的一个位置, 紧接该位置之前 的字符序列 不能匹配pattern。 例如对” regex represents regular expression ”这个字符串,要想匹配单词开头的 re ,可以用” (?<!\w)re ”。单词开头的 re ,在本例中,也就是指不在单词内部的 re ,即 re 前面不是单词字符。当然也可以用” \bre ”来匹配。

目录
相关文章
|
5月前
|
存储 前端开发 JavaScript
条件判断的模式问题之如果混淆了断言和卫述如何解决
条件判断的模式问题之如果混淆了断言和卫述如何解决
|
3月前
|
Java
断言21
断言21
38 3
|
4月前
一文搞懂正则表达式之零宽断言
零宽断言: 用于查找在某些内容之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。
206 0
一文搞懂正则表达式之零宽断言
|
JavaScript 编译器
🎖️typeScrpt中如何断言条件?
`asserts` 语句在 TypeScript 3.7 版本中首度亮相。它是一种特别类型的函数签名,旨在指示 TypeScript 编译器从某特定点开始某个特定条件为真。实际上,这些断言就像 if-then-error 语句的宏一样,赋予我们能力,能够在函数块的开端封装前置条件检查,以此提升代码的可预测性和稳定性。
88 0
|
7月前
|
测试技术 数据库
接口测试断言
接口测试断言
84 0
|
前端开发
前端学习案例13-断言&匹配模式2
前端学习案例13-断言&匹配模式2
54 0
前端学习案例13-断言&匹配模式2
|
前端开发
前端学习案例12-断言&匹配模式1
前端学习案例12-断言&匹配模式1
61 0
前端学习案例12-断言&匹配模式1
|
JavaScript 前端开发 编译器
TypeScript入门之类型推断、类型断言、双重断言、非空断言、确定赋值断言、类型守卫、类型别名
TypeScript学习过程中经常会看到类型推断、类型断言、双重断言、非空断言、确定赋值断言、类型守卫、类型别名,这几个概念到底表示啥呢?你真的搞清楚了吗?今天我们就来盘一盘它,帮你一次性弄懂。
313 0
|
测试技术
测试中进行断言是什么意思?底层原理是什么?
测试中进行断言是什么意思?底层原理是什么?
1455 0