介绍
先行(后行)断言:用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像
\b
,^
,$
那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言,即不匹配到最终结果里.
先行断言与后行断言各两种:
- 零宽正向先行断言
- 零宽负向先行断言
- 零宽正向后行断言
- 零宽负向后行断言
上面的"先行"表示匹配表达式前面的位置, "后行"表示匹配表达式后面的位置. "正向"代表是能够匹配,"负向"代表是不能匹配.
先行断言
零宽正向先行断言表达式:
<match>(?=pattern)
- 待匹配字符串:
starttime, startdate, endtime, enddate, timelogin, timelogout
- 正则表达式:
start(?=time)
结果匹配的是(深色部分): start
time, startdate, endtime, enddate, timelogin, timelogout, 正则表达式的意思是需要匹配start
之后是time
的部分.
零宽负向先行断言表达式:
<match>(?!pattern)
- 待匹配字符串:
starttime, startdate, endtime, enddate, timelogin, timelogout
- 正则表达式:
start(?!time)
结果匹配的是(深色部分): starttime, start
date, endtime, enddate, timelogin, timelogout, 正则表达式的意思是需要匹配start
之后不是time
的部分.
后行断言
零宽正向后行断言:
(?<=pattern)<match>
- 待匹配字符串:
starttime, startdate, endtime, enddate, timelogin, timelogout
- 正则表达式:
(?<=start)time
结果匹配的是(深色部分): starttime
, startdate, endtime, enddate, timelogin, timelogout, 正则表达式的意思是需要匹配time
之后是start
的部分.
零宽负向后行断言:
(?<!pattern)<match>
- 待匹配字符串:
starttime, startdate, endtime, enddate, timelogin, timelogout
- 正则表达式:
(?<!start)time
结果匹配的是(深色部分): starttime, startdate, endtime
, enddate, time
login, time
logot, 正则表达式的意思是需要匹配time
之后不是start
的部分.
需要注意的是,目前 JavaScript 并不支持后行断言,但是好消息是ES2018
已经开始支持了,具体最新的一些情况可以去这里看看What’s New in ES2018.