正则表达式之断言

用正则表达式在 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+$
Matching an IP address
Matching an IP address
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容