正则表达式 断言

先放断言的手册链接 : https://www.regular-expressions.info/lookaround.html

正则表达式的断言全称是: Lookahead and Lookbehind Zero-Length Assertions, 分为前瞻和后瞻, 符号是 ?=?<=, 同时它们都有其对应的反匹配, 就像数字的正反一样, 把 = 换成 ! 就行了, 分别为 ?!?<!

🍒 断言

直接统一说明断言, 断言也是一种零宽匹配, 就像 ^$ 一样, 返回的是位置

为了方便理解, 以编辑器为例, 一般正则都是返回匹配到的字符, 而断言返回的是光标, 不是字符, 注意看下面举例图片中光标的位置

^ 返回的是行首

行首

$ 返回的是行尾

行尾

(?=) 前瞻返回的是匹配到的字符串的头, 比如 (?=¥) 返回的是

前瞻

(?<=) 后瞻返回的是匹配到的字符串的尾, 比如 (?<=¥) 返回的是

后瞻

前后瞻无非返回的位置一前一后, 其他的都一致, 这就是断言了, 但是理解了这个不代表会用, 我们还要学习一些它们的用法, 阅读后面的示例是请先自己独立思考, 之后再看答案

🌰 断言的使用

实现前缀判断

比如现在想要匹配到前缀是 # 的 1 个数字, 怎么用断言实现呢?

答案是 (?<=#)(\d)

?<=# 返回的就是 # 字符后面的位置, 然后从这个位置 匹配后面的 一个数字, 就实现了前缀是 # 的效果

为什么是匹配后面的而不是匹配前面, 因为 (\d) 写在断言的后面, 同理写在

总结: 将 后瞻 写在 前面 实现前缀判断

实现后缀判断

匹配到后缀是 # 的 1 个数字, 怎么用断言实现呢?

答案是 (\d)(?=#)

?=# 返回的就是 # 字符前面的位置, 然后从这个位置开始 匹配前面的 匹配一个数字, 就实现了后缀是 # 的效果

总结: 将 前瞻 写在 后面 实现后缀判断

🌰 断言的阅读

(?!\d)(.+)

上面表达式的含义是 ? 对于以下文本, 匹配的结果是什么 ?

1
2
3
4
5
6
7
1123jkh123123coll%iderqweasdfzxv
1244collider5567%ertdf
kjhkj123klcolliderhlazcvg
123123jhk%j123klcolltyughj
ider5567asdf
123123col23jkhfg
collidercol2%3jkh

答案是 匹配一行中不以数字开头的部分, 结果为

1
2
3
4
5
6
7
jkh123123coll%iderqweasdfzxv
collider5567%ertdf
kjhkj123klcolliderhlazcvg
jhk%j123klcolltyughj
ider5567asdf
col23jkhfg
collidercol2%3jkh

(?!\d) 返回的是非数字的前面的位置, 然后从这个位置开始匹配任意串, 所以实现的是 提取一行中不以数字开头的部分, 这个也可以使用 ([^\d])+(.+) 实现

^((?!collider)(.))+$

上方表达式的含义是 ? 对于以下文本, 匹配的结果是什么 ?

1
2
3
4
5
6
7
1123jkh123123colliderqweasdfzxv
1244collider5567%ertdf
kjhkj123klcolliderhlazcvg
123123jhk%j123klcolltyughj
ider5567asdf
123123col23jkhfg
collidercol2%3jkh

答案是 匹配不包含单词 collider 的整行串, 结果为

1
2
3
123123jhk%j123klcolltyughj
ider5567asdf
123123col23jkhfg

使用 ^((.)(?<!collider))+$ 也可以实现同样的效果

(.) 是匹配任意字符, 之后是一个放在前面的前瞻断言, 含义是 后面不是collider的位置, 结合起来便是 不是以collider开头的字符, 不是以collider开头的字符 ? ? ? 不是以collider这个单词开头的字符 ? ? ? 不是以单词开头的字符 ? ? ? 这是什么鬼 ? ? ? 什么叫以单词开头的字符 ? ? ?

翻译一下, 就是 不是紧跟着ollider的字符c的任意字符, 也就是从任意字符中把一个 以ollider结尾的字符c 排除了, 其他的 c 可以, 以 ollider 结尾的 c 不行

最后在外面使用 ^()+$ 包起来, 表示只使用这样的字符构成一整行, 就是上面解析的, 使用 不是紧跟着ollider的字符c的任意字符 构成整行, 就实现了 不包含单词 collider 的行 的效果