Obeta

正则表达式的先行断言与后行断言

正则是个强大的'工具',可以帮助你处理各种复杂的字符串,例如爬虫和输入匹配检查等等.

介绍

先行(后行)断言:用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言,即不匹配到最终结果里.

先行断言与后行断言各两种:

  • 零宽正向先行断言
  • 零宽负向先行断言
  • 零宽正向后行断言
  • 零宽负向后行断言

上面的"先行"表示匹配表达式前面的位置, "后行"表示匹配表达式后面的位置. "正向"代表是能够匹配,"负向"代表是不能匹配.

先行断言

零宽正向先行断言表达式: <match>(?=pattern)

  • 待匹配字符串: starttime, startdate, endtime, enddate, timelogin, timelogout
  • 正则表达式: start(?=time)

结果匹配的是(深色部分): starttime, startdate, endtime, enddate, timelogin, timelogout, 正则表达式的意思是需要匹配start之后是time的部分.

零宽负向先行断言表达式: <match>(?!pattern)

  • 待匹配字符串: starttime, startdate, endtime, enddate, timelogin, timelogout
  • 正则表达式: start(?!time)

结果匹配的是(深色部分): starttime, startdate, 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, timelogin, timelogot, 正则表达式的意思是需要匹配time之后不是start的部分.

需要注意的是,目前 JavaScript 并不支持后行断言,但是好消息是ES2018已经开始支持了,具体最新的一些情况可以去这里看看What’s New in ES2018.

个人随笔记录,内容不保证完全正确,若需要转载,请注明作者和出处.