目录
1.使用正则表达式条件爬取
2.贪婪爬取:在爬取数据的时候尽可能的多爬取数据。
3.非贪婪爬取:在爬取数据的时候尽可能的少爬取数据。
4.正则表达式在字符串方法中的使用
5.正则表达式中的分组规则:
6.捕获分组:利用正则表达式捕获内容,并拿出来再用一次。(默认)
1.使用正则表达式条件爬取
非捕获分组:分组之后不需要再用本组数据,仅仅是把数据括起来(不占用分组)
- (?:regex) 忽略版本号,只要带版本号的前缀(获取所有)
- (?= regex) 只要带版本号的(获取前面部分)
- (? ! regex) 除带版本号的(获取不是指定内容的前面部分)
代码演示:
String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
//?= 忽略版本号,只要带版本号的前缀
String regex1 = "Java(?=8|11|17)";//Java Java Java Java
//?: 只要带版本号的
String regex2 = "Java(?:8|11|17)";//Java8 Java11 Java17 Java17
//?! 去除带版本号的
String regex3 = "Java(?!8|11|17)";//Java
Pattern p = Pattern.compile(regex1);
Matcher matcher = p.matcher(str);
while (matcher.find()){
System.out.print(matcher.group()+" ");
}
2.贪婪爬取:在爬取数据的时候尽可能的多爬取数据。
Java中默认的就是贪婪爬取。
3.非贪婪爬取:在爬取数据的时候尽可能的少爬取数据。
如果我们在数量词+*的后面加上问号,那么此时就是非贪婪爬取。
4.正则表达式在字符串方法中的使用
- public String[] matches (String regex):判断字符串是否满足正则表达式的规则
- public string replaceAll(String regex, string newStr):按照正则表达式的规则进行替换。
- public string[] split(string regex):按照正则表达式的规则切割字符串
String s = "张三dsadsdas123李四sfdssadjiaj126王五ksdkoasasda112老六";
String result = s.replaceAll("[\\w&&[^_]]+", "vs");
System.out.println(result);//张三vs李四vs王五vs老六
String[] arr = s.split("[\\w&&[^_]]+");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");//张三 李四 王五 老六
}
5.正则表达式中的分组规则:
- 从1开始,连续不间断。
- 以左括号为基准,最左边的是第一组,其次是第二组,以此类推。
6.捕获分组:利用正则表达式捕获内容,并拿出来再用一次。(默认)
- \\组号:正则表达式内部使用
- $组号:正则表达式外部使用
案例1:
String regex1= "(.).+\\1";
// \\组号:表示把第X组的内容再拿出来用一次
System.out.println("a123a".matches(regex1));//T
String regex2 = "(.+).+\\1";
System.out.println("abcssabc".matches(regex2));//T
//(.) 把首字母看成一组,\\2:把首字母拿出来再次使用 *表示后面重复的内容出现0次或多次
String regex3 = "((.)\\2*).+\\1";
System.out.println("aaasdsaaa".matches(regex3));//T
案例2:
String str = "我要学学编编编编编编程程程程程程";
//(.)取重复的字符作为第一组
//\\1 再次出现
//1+ 出现至少一次
//$1 复用第一组的内容
String result = str.replaceAll("(.)\\1+", "$1");
System.out.println(result);//我要学编程