正则表达式-断言-预查

本文最后更新于:2020年12月22日 上午

前言

文章默认以从左向右,从前到后描述方向
有些翻译会将 assert 翻译作预查,有些则翻译为断言

我更喜欢断言这种翻译,所以后文我都用这个词

信息

断言是正则表达式的一种用法
主要是在表达式的某个位置发出向某个方向的声明断言判断
如果不符合断言所描述的场景,那么就认为匹配失败

仅作理解用的举例:

1
为什么不问问这个神奇的海螺呢?

例1:”海螺”这个词前面是”神奇的”这个词
那么这个断言是符合句子中的场景的,因为“海螺”前面确实是”神奇的”这个词

例2:”神奇的”后面是”烤肉”这个词
那么这个断言是不符合句子中的场景的,因为”神奇的”后面不是“烤肉”,而是“海螺”

断言肯否 - 肯定positive/否定negative

断言肯定与否定举例

1
接招吧DIO!半径30米的绿宝石飞溅!!!

肯定断言:“绿宝石飞溅”前面是”半径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 协议 ,转载请注明出处!