最近在工作中经常需要运用正则表达式,比如匹配以XX结尾的字符串,匹配括号内的内容(包括或者不包括括号)等等,自己这方面一直比较薄弱,因此在网上搜索了很多关于正则的内容,找到了一个叫零宽断言的方法。
概念:
零宽断言是正则表达式的一种方法,用于查找在某些内容(但并不包括这些内容)之前或者之后的东西,也就是说他们像\b(匹配一个单词边界,也就是单词和空格间的位置,正则表达式的匹配有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置,例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”),^(匹配输入字行首),$(匹配输入字行尾)那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。断言用来声明一个应该为真的事实,正则表达式中只有当断言为真时才会继续进行匹配。
零宽断言一共分为四种
1.零宽度正预测先行断言 (?=exp)匹配exp前面的位置
例:\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
2.零宽度正回顾后发断言 (?<exp)匹配exp后面的位置
例:比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
3.零宽度负预测先行断言 (?!exp)匹配后面跟的不是exp的位置
例:例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。
4.零宽度负回顾后发断言 (?<!exp)匹配前面不是exp的位置
例:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。