正则表达式之断言

2016-12-06  本文已影响0人  李貌

用正则表达式在 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 addressMatching an IP address
上一篇 下一篇

猜你喜欢

热点阅读