正则表达式 断言
先放断言的手册链接 : https://www.regular-expressions.info/lookaround.html
正则表达式的断言全称是: Lookahead and Lookbehind Zero-Length Assertions
, 分为前瞻和后瞻, 符号是 ?=
和 ?<=
, 同时它们都有其对应的反匹配, 就像数字的正反一样, 把 =
换成 !
就行了, 分别为 ?!
和 ?<!
🍒 断言
直接统一说明断言, 断言也是一种零宽匹配, 就像 ^
和 $
一样, 返回的是位置
为了方便理解, 以编辑器为例, 一般正则都是返回匹配到的字符, 而断言返回的是光标, 不是字符, 注意看下面举例图片中光标的位置
^
返回的是行首
$
返回的是行尾
(?=)
前瞻返回的是匹配到的字符串的头, 比如 (?=¥)
返回的是
(?<=)
后瞻返回的是匹配到的字符串的尾, 比如 (?<=¥)
返回的是
前后瞻无非返回的位置一前一后, 其他的都一致, 这就是断言了, 但是理解了这个不代表会用, 我们还要学习一些它们的用法, 阅读后面的示例是请先自己独立思考, 之后再看答案
🌰 断言的使用
实现前缀判断
比如现在想要匹配到前缀是 # 的 1 个数字, 怎么用断言实现呢?
答案是 (?<=#)(\d)
?<=#
返回的就是 # 字符后面的位置, 然后从这个位置 匹配后面的
一个数字, 就实现了前缀是 # 的效果
总结: 将 后瞻
写在 前面
实现前缀判断
实现后缀判断
匹配到后缀是 # 的 1 个数字, 怎么用断言实现呢?
答案是 (\d)(?=#)
?=#
返回的就是 # 字符前面的位置, 然后从这个位置开始 匹配前面的
匹配一个数字, 就实现了后缀是 # 的效果
总结: 将 前瞻
写在 后面
实现后缀判断
🌰 断言的阅读
(?!\d)(.+)
上面表达式的含义是 ? 对于以下文本, 匹配的结果是什么 ?
1 | 1123jkh123123coll%iderqweasdfzxv |
答案是 匹配一行中不以数字开头的部分, 结果为
1 | jkh123123coll%iderqweasdfzxv |
(?!\d)
返回的是非数字的前面的位置, 然后从这个位置开始匹配任意串, 所以实现的是 提取一行中不以数字开头的部分
, 这个也可以使用 ([^\d])+(.+)
实现
^((?!collider)(.))+$
上方表达式的含义是 ? 对于以下文本, 匹配的结果是什么 ?
1 | 1123jkh123123colliderqweasdfzxv |
答案是 匹配不包含单词 collider 的整行串, 结果为
1 | 123123jhk%j123klcolltyughj |
使用 ^((.)(?<!collider))+$
也可以实现同样的效果
(.)
是匹配任意字符, 之后是一个放在前面的前瞻断言, 含义是 后面不是collider的位置, 结合起来便是 不是以collider开头的字符, 不是以collider开头的字符 ? ? ? 不是以collider这个单词开头的字符 ? ? ? 不是以单词开头的字符 ? ? ? 这是什么鬼 ? ? ? 什么叫以单词开头的字符 ? ? ?
翻译一下, 就是 不是紧跟着ollider的字符c的任意字符, 也就是从任意字符中把一个 以ollider结尾的字符c
排除了, 其他的 c 可以, 以 ollider 结尾的 c 不行
最后在外面使用 ^()+$
包起来, 表示只使用这样的字符构成一整行, 就是上面解析的, 使用 不是紧跟着ollider的字符c的任意字符 构成整行, 就实现了 不包含单词 collider 的行 的效果