package com.zzh.day2;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* img/SpecialConstructs.png
* */
public class demo7 {
public static void main(String[] args) {
// String string = "444a66ba";
String string = "456a78ba";
/*
* 解释一下:这里(?=a)应该是不捕获等于a的这个字符,然而在a78这个位置,已经可以匹配到a这个字符,已经属于能匹配该正则表达式的字符串
* 故a不捕获,然而又从不捕获但属于匹配位置的地方开始匹配三个字符,即是a78
* */
Pattern p1 = Pattern.compile("(?=a).{3}");//不捕获的意思
Matcher m1 = p1.matcher(string);
if (m1.find()) {
System.out.println("m1 "+m1.group());//输出a78
}
/*
* 解释一下,没什么好解释的,就是不捕获a,并且下一次匹配的位置从这个a开始,,所以是444 66b
* 若正则表达式改成.{4}(?=a),,则匹配到的字符串就是a66b,这样,,就更明显了
* */
Pattern p2 = Pattern.compile(".{3}(?=a)");
Matcher m2 = p2.matcher(string);
while(m2.find()){
System.out.println("m2 "+m2.group());//输出456 78b
}
/*456a78ba
* 解释一下:顾名思义,就是匹配不是a的,从头开始,56a7,7不是a,8ba最后什么也没有,也不是a,故匹配到56a 8ba
* */
Pattern p3 = Pattern.compile(".{3}(?!a)");
Matcher m3 = p3.matcher(string);
while(m3.find()){
System.out.println("m3 "+m3.group());//56a 8ba
}
/*456a78ba
* 解释一下:前面不是a
* 开始,4,不是a,匹配,然后这个4不捕获,从4开始找3个字符,即是456
* 继续,a,不匹配,后移,7,不是a,匹配,不捕获,从7开始找3个字符,即是78b
* */
Pattern p4 = Pattern.compile("(?!a).{3}");
Matcher m4 = p4.matcher(string);
while(m4.find()){
System.out.println("m4 "+m4.group());//456 78b
}
/*a456a78ba
* 解释一下:对于每个匹配的片段的方式来讲,和.{3}(?!a)是反过来的,
*
* */
Pattern p5 = Pattern.compile(".{3}(?<!a)");
Matcher m5 = p5.matcher(string);
while(m5.find()){
System.out.println("m5 "+m5.group());//456 a78
}
/*
* 解释一下:
* */
Pattern p6 = Pattern.compile("(?<!a).{3}");
Matcher m6 = p6.matcher(string);
while(m6.find()){
System.out.println("m6 "+m6.group());//456 a78
}
/*456a78ba
* 解释一下:
* */
Pattern p7 = Pattern.compile("(?<=a).{3}");
Matcher m7 = p7.matcher(string);
while(m7.find()){
System.out.println("m7 "+m7.group());//78b
}
/*456a78ba
* 解释一下:可以这么想,456a是匹配这个正则表达式的,然而
* */
Pattern p8 = Pattern.compile(".{3}(?<=a)");
Matcher m8 = p8.matcher(string);
while(m8.find()){
System.out.println("m8 "+m8.group());//56a 8ba
}
/*back references
* 向前引用\\1 代表第一个组(没错,是第一个组,\\2表示第二组)捕捉之后的那个字符串,相同才是true
* */
Pattern p9 = Pattern.compile("(\\d\\d)\\1([a-z][a-z])\\2");
String s = "1212abab";
Matcher m9 = p9.matcher(s);
System.out.println(m9.matches());
//不区分大小写
Pattern p10 = Pattern.compile("java",Pattern.CASE_INSENSITIVE);
Pattern p10_ = Pattern.compile("(?i)(java)");//(?i)的意义在SpecialConstructs.png
//以上两个正则表达式的匹配的意义是相同的
System.out.println(p10.matcher("JAVA").matches());
System.out.println(p10_.matcher("JAVA").matches());
}
}
输出结果:
m1 a78
m2 456
m2 78b
m3 56a
m3 8ba
m4 456
m4 78b
m5 456
m5 a78
m6 456
m6 a78
m7 78b
m8 56a
m8 8ba
true
true
true
路过的大佬,这篇文里面错误或者不准确的地方,跪求指正!