正则表达式-断言-预查
本文最后更新于:2020年12月22日 上午
前言
文章默认以从左向右,从前到后描述方向
有些翻译会将 assert 翻译作预查,有些则翻译为断言
我更喜欢断言这种翻译,所以后文我都用这个词
信息
断言是正则表达式的一种用法
主要是在表达式的某个位置发出向某个方向的声明断言判断
如果不符合断言所描述的场景,那么就认为匹配失败
仅作理解用的举例:
1 |
|
例1:”海螺”这个词前面是”神奇的”这个词
那么这个断言是符合句子中的场景的,因为“海螺”前面确实是”神奇的”这个词
例2:”神奇的”后面是”烤肉”这个词
那么这个断言是不符合句子中的场景的,因为”神奇的”后面不是“烤肉”,而是“海螺”
断言肯否 - 肯定positive/否定negative
断言肯定与否定举例
1 |
|
肯定断言:“绿宝石飞溅”前面是”半径30米”
否定断言:“绿宝石飞溅”前面不是”半径30米”
断言方向 - 正向look ahead/反向look behind
断言只有两个场景场景,即:断言在描述场景前/后
这对应着正则表达式的两种类型的断言
- 正向断言
对前文的断言。断言当前文本前面(没)有什么 - 反向断言
对后文的断言。断言当前文本后面(没)有什么
不知为什么有些文章会将这个方向说成与肯否弄反,此处采用维基百科的说法
非获取匹配 - 零宽
指匹配pattern但不获取匹配的子字符串(shy groups),也就是说这是一个非获取匹配,不存储匹配的子字符串用于向后引用
简单来说就是,断言的内容只用作判断,最终返回的内容不会包含断言的内容
语言限制
不同语言不同库可能对正则表达式的断言声明有着不同的限制
比如:
JavaScript
中并不支持后行断言Python
中并不支持变长后行断言
也许未来会支持也不一定,不过现在的情况是这样的
正则表达式断言
表达式 | 方向 | 肯否 | 描述 | 举例 |
---|---|---|---|---|
(?=pattern) | 正向 | 肯定 | 零宽度正先行断言 仅当子表达式 pattern 在 此位置的右侧匹配时才继续匹配。 |
\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。 |
(?!pattern) | 正向 | 否定 | 零宽度负先行断言 仅当子表达式 pattern 不在 此位置的右侧匹配时才继续匹配。 |
/w+(?!/d) 与后不跟数字的单词匹配,而不与该数字匹配 。 |
(?<=pattern) | 反向 | 肯定 | 零宽度正后发断言 仅当子表达式 pattern 在 此位置的左侧匹配时才继续匹配。 |
(?<=19)99 与跟在 19 后面的 99 的实例匹配。 |
(?<!pattern) | 反向 | 否定 | 零宽度负后发断言 仅当子表达式 pattern 不在此位置的左侧匹配时才继续匹配。 |
(?<!19)99 与不跟在 19 后面的 99 的实例匹配 |
参考
维基百科-正则表达式: https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!