首先这个不属于技术文章,因为它是从新手的角度理解,也不苛求用技术术语规范表达,技术大神不要鄙视,可以无视。因为我也是小白,一开始也对断言摸不清头脑。什么正向环视,负向环视,一头雾水。言归正传!断言也叫环视,听上去就是意思是有假设和判断性质。
知道^和$吧?代表位置,行的开头和结尾,不占用空间,就是透明空气。干脆姑且先这样理解:
(?<=xx)和(?<!xx)相当于^。
(?=xx)和(?!xx)相当于$。
只是这里的^$是附带条件的。
===================
意思是括号外面紧挨着括号的东东有啥条件要求,把括号理解为"位置"。带左箭头<的,表示位置左边,不带的表示位置的右边。如A(?<!\d).(?!\d)B。断言是修饰条件,也可以把断言通俗理解为修饰符。这里的A和B也可以为空,或者是通配符如.?
A(?<=xx)(?<!xx)是说它们前面的字符A要具备啥条件,应该等于啥或者是什么样的A。(?=xx)(?!xx)B,是说它们后面的字符B具备啥条件,应该等于啥或者啥样的B。如这个表达式: (.)(?!\1)(.)\2
位置上讲一个是开头,一个是结尾,只是这个开头和结尾可以在字符串中间位置人为划定。翻译过来就是开头(不)等于xx,结尾(不)等于xx。但是仅仅是约束规则,不占用字符空间,也不匹配任何东西。所以不能在后面加上数量词,加上也无效。继续如图
也可以把<理解为←左箭头,没有左箭头的视为按照正则引擎向右判断的默认方向,指向右→。
图片来自: 灵鸟路空。