目录

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);//我要学编程