A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 秦二江 中级黑马   /  2013-5-24 09:29  /  1939 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置

这个位置是 什么意思

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

2 个回复

倒序浏览
就是指"exp"这个字符串(也可以是其他类型)所在在你所需要匹配的字符串中所在的位置。。。。。。

以下是一些网上找到的说明
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)


负向零宽断言要注意的跟正向的一样。
回复 使用道具 举报
第一种是所谓的零宽度正预测先行断言,以(?=exp)的形式出现,它匹配的是exp前面的那个位置,特别要注意的是它匹配的只是一个位置,而不是任何字符。比如,/b/w+(?=ing/b)在查找I'm singing while you're dancing的时候会匹配sing和danc,因为其中的

(?=ing)匹配了singing的sing和ing之间的那个位置,还有dancing的danc和ing之间的位置,即ing之前的那个位置。如果理解了第一

种零宽断言,后面的三种也就很好理解了。
第二种是零宽度正回顾后发断言,以(?<=exp)的形式出现,它匹配的是exp后面的那个位置。同样是上面的那个例子,如果正则表达式变为/b/w+(?<=ing/b),匹配结果就变成了singing和dancing,因为(?<=ing)匹配的是ing后面的位置。
第三种是零宽度负预测先行断言,以(?!exp)的形式出现,它匹配的是后面跟的不是exp的位置。比如/b/w+n(?!g)/w+/b,在查找I'm

singing while you're dancing的时候匹配了dancing,因为n(?!g)指的就是n后面不跟g,所以虽然有好几个单词里都有n,但是只有

dancing里有n后面不跟g。
第四种是零宽度正回顾后发断言,以(?<!exp)的形式出现,它匹配的是前面不是exp的位置。同样是第三种情况的那个例子,如果用/b/w+n(?<!g)/w+/b去查找I'm singing while you're dancing的话会匹配singing和dancing,因为这两个单词的n的前面都不是g。
总之,零宽断言是用来匹配和exp相关的位置的,不是匹配任意的字符。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马