用正则表达式在 sublime 编辑器中搜索文本,是我的一个趣味。
常出现的场景是,搜索 A 位置旁边的 B ,比如:
给定:“class 1,class a,class 一”
获取结果:“1”
、“a“
、”一”
这里就可以用到断言,断定 class的位置去寻找后面的元素。
官方给断言的分类,叫:零宽度正预测先行断言、零宽度正回顾后发断言……
设计者妖兽啊,起这么绕口难理解的名字!实际上非常简单,我总结下
断言公式:
假定 B 代表 “1”、“a“、”一” ,我们想要的结果; A 代表我们已知的 "class" 断言
(?<=A)B # 匹配前面是 A 的 B
(?<!A)B # 匹配前面非 A 的 B
B(?=A ) # 匹配后面是 A 的 B
B(?!A) # 匹配后面非 A 的 B
(? ) 虽然同是括号,但这货多了个问号在前面,它就不是分组, 而是一个位置断言,是为获取结果设立的辅助条件,不会输出到结果
有 < 代表前断言,无 < 代表后断言
= 代表是,! 代表非
最后再加上漏掉的一个 (?: A) 冒号的意思仅仅是不要将此作为分组。有时候我们会为了用或|
条件而用到分组,但是又不想获取此分组,便可如此使用
示例:
IP Address
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
Url Pattern:
/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
Email Pattern:
/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
素数 Pattern
^1?$|^(11+)\1+$