正则表达式零宽断言

正则表达式里”零宽断言”这个词可能有很多不同的说法, 比如环视, 正向匹配, 反向匹配, 零宽度负预测先行断言… [su_table] 正向/预测先行/顺序/ 从左到右/pattern的前面位置 负向/回顾后发/逆序/ 从右到左/pattern的后面位置 肯定/正 (?=pattern) (?<=pattern) 否定/负 (?!pattern) (?<!pattern) [/su_table] 书写规则是肯定用”=”, 否定用”!”(和一般编程语言类似); 顺序不加”<“, 逆序在”?”后加”<“. “零宽” 意思是零宽度, 就是说此(?=pattern)匹配的并不是几个字符, 而是一个”位置”或者说”长度为0的字符”, 比如对于字符串”233″, (?<=2)匹配结果是”2<这个位置>33″. 与常见的匹配开头位置的”^”, 匹配结尾位置的”$”是类似的. “^”和”$”匹配到的就是”位置”而不是实际的几个字符. 本来一个子字符串可以用两个值来确定, 比如开头位置&结尾位置, 零宽的情况就是开头位置=结尾位置, 虽然信息量变少了, 但是开头(结尾)位置这一信息还是存在的. “断言”意思是要求判断为真, 就是说它是用来做判断的而不是实际内容. 考虑用以下正则表达式匹配字符串”ABAC”: AB 匹配紧接着的字符”A”及其后的字符”B”, 共1+1=2个字符, 结果是 “AB”(前两个字符) A(?=B) 匹配紧接着的字符”A”及其后的 字符”B”的前面的位置, 共1+0=1个字符, 结果是第一个”A”以及 第一个”A”及”B”前面的位置, 所以也就是第一个”A”. 而第二个”A”是无法被匹配到的, 因为第二个”A”之后紧接着的是 字符”C”前面的位置, 不符合”(?=B)” A(?!B) … Continue reading 正则表达式零宽断言