/*.{3}(?=a)代表着这样的功能:
* 查找给出的字符串中符合a前面有三个字母的这样的子串,当然取得的子串不包括(?=a)
*/
Pattern p = Pattern.compile(".{3}(?=a)");//(?=X) X,通过零宽度的正 lookahead
String s1 = "444a66b";
Matcher m = p.matcher(s1);
while (m.find()) {
p(m.group());
}
p("***********************************");
/*同理\\d{3}(?=a)代表着这样的功能:
* 查找给出的字符串中符合a前面有三个数字的这样的子串,当然取得的子串不包括(?=a)
* 本例给出的444a66b是匹配的,得出的group是444
* 而 "44d4a66b";是不匹配的,因为没有在a之前没连续的三个数字
* 在例如.{3}(?=b)这样的匹配,如果用来匹配444a66b得到的字符串是a66
*/
p = Pattern.compile("\\d{3}(?=a)");//(?=X) X,通过零宽度的正 lookahead
String s2 = "444a66b";
m = p.matcher(s2);
while (m.find()) {
p(m.group());
}
p("***********************************");
/**
* 通过上面的(?=X)下面来测试和设想一下(?!a),api解释为
* (?!X) X,通过零宽度的负lookahead,所以对比一下很容易想到
* \\d{3}(?!a)代表着连续三个数字的后面出现的字符不是a的匹配,
* 所以字符串444a666b只有一个匹配子串666
* 字符串444b666b两个匹配444 666
* 字符串444a666a都不匹配
*/
p = Pattern.compile("\\d{3}(?!a)");//(?!X) X,通过零宽度的负lookahead
String s3 = "444b666b";
m = p.matcher(s3);
while (m.find()) {
p(m.group());
}
每天一点正则表达式积累之(?=X)和(?!X)测试(七)
关注
打赏