以后填坑用
正则中的零宽断言分为正向零宽先行断言,和负向零宽先行断言,先看一段代码:
Pattern pattern = Pattern.compile("ab(?=[A-Z])");
Matcher matcher=pattern.matcher("abZW863");
if(matcher.find()){
System.out.println(matcher.group());
}
结果输出为:
ab
匹配后面跟随任意一个大写字母的字符串”ab”。最终匹配结果是”ab”,因为零宽断言”(?=[A-Z])”并不匹配任何字符,只是用来规定当前位置的后面必须是一个大写字母。
再看一段代码:
Pattern pattern = Pattern.compile("ab(?![A-Z])");
Matcher matcher=pattern.matcher("abZW863");
if(matcher.find()){
System.out.println(matcher.group());
}
其结果无输出,原因在原matcher.find()结果为false,其语义是匹配后面不跟随任意一个大写字母的字符串”ab”。正则表达式没能匹配任何字符,因为在字符串中,ab的后面跟随有大写字母。
(?=exp) 零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式。
(?<=exp) 零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式。
负向:
(?!exp) 零宽度负预测先行断言,它断言此位置的后面不能匹配表达式。
(?<!exp) 零宽度负回顾后发断言,它断言此位置的前面不能匹配表达式。
正则表达式中的量词
- 贪心
- 懒惰
- 占有