零宽断言详解
零宽断言的意思是(匹配宽度为零,满足一定的条件/断言) 我也不知道这个词语是那个王八蛋发明的,简直是太拗口了。 零宽断言用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像 b ^ $ &; &; 这样的锚定作用,用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。 其中零宽断言又分四种: 1) 先行断言 也叫零宽度正预测先行断言(?=exp) -- 表示匹配表达式前面的位置 例如 [a-z]*(?=ing) 可以匹配 cooking 和 singing 中的 cook 与 sing 。 注意:先行断言的执行步骤是这样的先从要匹配的字符串中的最右端找到第一个 ing (也就是先行断言中的表达式)然后 再匹配其前面的表达式,若无法匹配则继续查找第二个 ing 再匹配第二个 ing 前面的字符串,若能匹配则匹配,符合正则的贪婪性。 例如: .*(?=ing) 可以匹配 "cooking singing" 中的 "cooking sing" 而不是 cook 2) 后发断言也叫零宽度正回顾后发断言(?<=exp) -- 表示匹配表达式后面的位置 例如(?<=abc).* 可以匹配 abcdefg 中的 defg 注意:后发断言跟先行断言恰恰相反 它的执行步骤是这样的:先从要匹配的字符串中的最左端找到第一个abc(也就是先行断言中的表达式)然后 再匹配其后面的表达式,若无法匹配则继续查找第二个 abc 再匹配第二个 abc 后面的字符串,若能匹配则匹配。 例如(?<=abc).* 可以匹配 abcdefgabc 中的 defgabc 而不是 abcdefg 3) 负向零宽断言 负向零宽断言 (?!exp) 也是匹配一个零宽度的位置,不过这个位置的“断言”取表达式的反值,例如 (?!exp) 表示 "exp" 前面的位置,如果 "exp" 不成立 ,匹配这个位置;如果 "exp" 成立,则不匹配。同样,负向零宽断言也有“先行”和“后发”两种,负向零宽后发断言为 (?<!exp) 负向零宽后发断言(?<!exp) 负向零宽先行断言 (?!exp) 负向零宽断言要注意的跟正向的一样。
例子: cat file aaa bbb CD="123" fd 要取出CD后面的值:
[解析] 以 CD=" 为后发断言,匹配它后面的多个数字。
cat file Rx Optical Power: -5.01dBm,Tx Optical Power: -2.41dBm 要取出那几个分贝的值: -5.01 -2.41
[解析] 后发断言 ”: “ 后面的字符串,直到 d 字符前面的字符串,? 号的作用是避免贪婪匹配。 cat file ["check_ssh",ok],["check_eth",["check_disk",["check_swap",["check_mem",["check_hardware",false],["check_filesystem",["check_port",["check_redis-server",["check_login",ok] 取出[ ]中含 false 字样的内容:
check_hardware check_filesystem
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |