先行断言(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 ”来匹配。

目录
相关文章
|
4月前
|
存储 前端开发 JavaScript
条件判断的模式问题之如果混淆了断言和卫述如何解决
条件判断的模式问题之如果混淆了断言和卫述如何解决
|
2月前
|
Java
断言21
断言21
32 3
|
JavaScript 编译器
🎖️typeScrpt中如何断言条件?
`asserts` 语句在 TypeScript 3.7 版本中首度亮相。它是一种特别类型的函数签名,旨在指示 TypeScript 编译器从某特定点开始某个特定条件为真。实际上,这些断言就像 if-then-error 语句的宏一样,赋予我们能力,能够在函数块的开端封装前置条件检查,以此提升代码的可预测性和稳定性。
83 0
|
6月前
|
传感器 安全 编译器
【C++断言机制】深入理解C/C++ 中静态断言static_assert与断言 assert
【C++断言机制】深入理解C/C++ 中静态断言static_assert与断言 assert
139 0
|
前端开发
前端学习案例13-断言&匹配模式2
前端学习案例13-断言&匹配模式2
51 0
前端学习案例13-断言&匹配模式2
|
前端开发
前端学习案例12-断言&匹配模式1
前端学习案例12-断言&匹配模式1
57 0
前端学习案例12-断言&匹配模式1
|
XML JSON 搜索推荐
Jmeter常用断言之响应断言详解
**响应断言**是最常用的一种断言方法,主要是对响应结果中的文本内容进行断言,比如响应结果是否包含指定的值,或者是否等于指定的值。响应断言可以适用各种返回类型的响应结果,如:Test、html、application/json、application/xml等。。。
494 0
Jmeter常用断言之响应断言详解
|
JavaScript 前端开发 编译器
TypeScript入门之类型推断、类型断言、双重断言、非空断言、确定赋值断言、类型守卫、类型别名
TypeScript学习过程中经常会看到类型推断、类型断言、双重断言、非空断言、确定赋值断言、类型守卫、类型别名,这几个概念到底表示啥呢?你真的搞清楚了吗?今天我们就来盘一盘它,帮你一次性弄懂。
307 0