1、基本概念
- 断言:俗话的断言就是“我断定什么什么”,而正则中的断言,就是说正则可以指明在指定的内容的前面或后面会出现满足指定规则的内容,
意思正则也可以像人类那样断定什么什么,比如"ss1aa2bb3",正则可以用断言找出aa2前面有bb3,也可以找出aa2后面有ss1. - 零宽:就是没有宽度,在正则中,断言只是匹配位置,不占字符,也就是说,匹配结果里是不会返回断言本身。
零宽断言正如它的名字一样,是一种零宽度的匹配,它匹配到的内容不会保存到匹配结果中去,最终匹配结果只是一个位置而已。
javascript只支持零宽先行断言,而零宽先行断言又可以分为正向零宽先行断言,和负向零宽先行断言。
代码实例如下:
实例代码一:
var str="abZW863";
var reg=/ab(?=[A-Z])/;
console.log(str.match(reg));
在以上代码中,正则表达式的语义是:匹配后面跟随任意一个大写字母的字符串"ab"。最终匹配结果是"ab",因为零宽断言"(?=[A-Z])"并不匹配任何字符,只是用来规定当前位置的后面必须是一个大写字母。
实例代码二:
var str="abZW863";
var reg=/ab(?[A-Z])/;
console.log(str.match(reg));
以上代码中,正则表达式的语义是:匹配后面不跟随任意一个大写字母的字符串"ab"。正则表达式没能匹配任何字符,因为在字符串中,ab的后面跟随有大写字母。
2、正向先行断言
- 语法:(?=pattern)
- 作用:匹配pattern表达式的前面内容,不返回本身。
比如想取到阅读量
<span class=\"read-count\">阅读数:641</span>
在正则表达式中就意味着要能匹配到‘</span>’前面的数字内容
按照上所说的正向先行断言可以匹配表达式前面的内容,那意思就是:(?=</span>) 就可以匹配到前面的内容了。
匹配什么内容呢?如果要所有内容那就是:
1 String reg=".+(?=</span>)";
2
3 String test = "<span class=\"read-count\">阅读数:641</span>";
4 Pattern pattern = Pattern.compile(reg);
5 Matcher mc= pattern.matcher(test);
6 while(mc.find()){
7 System.out.println("匹配结果:")
8 System.out.println(mc.group());
9 }
10
11 //匹配结果:
12 //<span class="read-count">阅读数:641
如果我们要的只是前面的数字,匹配数字 \d,那可以改成:
1 String reg="\\d+(?=</span>)";
2 String test = "<span class=\"read-count\">阅读数:641</span>";
3 Pattern pattern = Pattern.compile(reg);
4 Matcher mc= pattern.matcher(test);
5 while(mc.find()){
6 System.out.println(mc.group());
7 }
8 //匹配结果:
9 //641
3、正向后行断言:
- 语法:(?<=pattern)
- 作用:匹配pattern表达式的后面的内容,不返回本身。
有先行就有后行,先行是匹配前面的内容,那后行就是匹配后面的内容啦。
上面的栗子,我们也可以用后行断言来处理.
1 //(?<=<span class="read-count">阅读数:)\d+
2 String reg="(?<=<span class=\"read-count\">阅读数:)\\d+";
3
4 String test = "<span class=\"read-count\">阅读数:641</span>";
5 Pattern pattern = Pattern.compile(reg);
6 Matcher mc= pattern.matcher(test);
7 while(mc.find()){
8 System.out.println(mc.group());
9 }
10 //匹配结果:
11 //641
4、负向先行断言
- 语法:(?!pattern)
- 作用:匹配非pattern表达式的前面内容,不返回本身。
有正向也有负向,负向在这里其实就是非的意思。
举个栗子:比如有一句 “我爱祖国,我是祖国的花朵”
现在要找到不是'的花朵'前面的祖国
用正则就可以这样写:
1 祖国(?!的花朵)
5、负向后行断言
- 语法:(?<!pattern)
- 作用:匹配非pattern表达式的后面内容,不返回本身。
本文参考
https://www.cnblogs.com/macq/p/6597366.html
https://www.zhihu.com/question/48219401/answer/742444326