常用API之爬虫

爬虫:在一段文本中寻找到满足正则表达式的目标并记录。

public static void main(String[] args) {
        String str="java是一种很好用的语言,java12是一种无所不能的语言,java134是啥我也不知道哈哈哈啊哈哈哈,java22";

        //1、获取目标正则表达式对象,定义一种规则
        Pattern p=Pattern.compile("java\\d{0,2}");

        //2、拿着m去寻找str中符合p规则的串
        Matcher m=p.matcher(str);

        while(m.find()){
            //获取到就会返回true并切保存坐标
            //遍历完就会返回false

            //根据find方法截取的字符串进行字符串的截取
            //拿着文本匹配起从头读区,看看有没有满足条件的子串
            //没有返回false
            //有的话返回true,并且在底层记录其实索引和结束索引+1
            String s=m.group();
            System.out.println(s);
        }
    }

带条件的爬取

通过非捕获分组进行爬取,?=匹配时看全部,保留前面

 public static void main(String[] args) {
        //?表示前面的数据java
        //=表示java后所需要跟随的数据
        //但是在获取的时候只获取前部分

        String str="java是一种很好用的语言,Java11是一种无所不能的语言,java7是啥我也不知道哈哈哈啊哈哈哈,java8";
        String regex="((?i)java)(?=7|8|11)";
        //(?i)忽略大小写

        //获取正则表达式
        Pattern p=Pattern.compile(regex);

        //用m根据p寻找数据
        Matcher m=p.matcher(str);

        while(m.find()){
            System.out.println(m.group());
        }
    }

贪婪爬取

举个例子:abbbbbbbbbbbbbbaaaaaaaaaaaa

按照ab+的方法进行爬取

b尽可能多的获取->贪婪爬取,默认都为贪婪爬取

b尽可能少的获取->非贪婪爬取

 public static void main(String[] args) {
         //贪婪爬取:尽可能多的获得数据
        //非贪婪爬取:尽可能少的获取数据

        /*
        ab+:
        贪婪爬取:abbbbbbbbb
        非贪婪爬取:ab

        java中默认的就是贪婪爬取
        如果我们在数量词+*的后面加上问号,此时就是非贪婪爬取
         */

        String str="abbbbbbbbbbbbaaaaaaaaaa大牌呢打发发发发发发呢了你疯了"
                +"打烦恼发吧饿哦烦恼你发嗯飞飞飞";


        String regex="ab+?";//在这个问号后面加上?就变成了非贪婪爬取
        Pattern p=Pattern.compile(regex);

        Matcher m=p.matcher(str);

        while(m.find()){
            System.out.println(m.group());
        }
    }

1、捕获分组和非捕获分组:

正则表达式有这两种

2、捕获分组(默认):

可以获取每组中的内容并反复使用

3、组号特点:

从1开始连续不间断

以左括号为基准,最左边是第一组

4、非捕获分组:

分组过后不需要再使用本组数据,仅仅把数据括起来,不含组号。

 public static void main(String[] args) {
        //规则1:从1开始,连续不间断
        //规则2:以左括号为基准,最左边是第一组,其次为第二组,以此类推
        //捕获分组就是将这一组的数据捕获出来,再用一次

        //需求:看前面的字符和后面的字符是否相等,一个或者多个字符?
        //开始部分的每个字符是否也相等?

        // \\数字 表示把前面的内容拿过来复用
        String regex="(.).+\\1";
        System.out.println("a123a".matches(regex));//一个字符

        String regex1="(.+).+\\1";
        System.out.println("abc123abc".matches(regex1));

        // *表示可以出现0次或者多次
        String regex2="((.)\\2*).+\\1";//左括号排序,里面的东西是第二个括号
        System.out.println("aac123aac".matches(regex2));
    }
public static void main(String[] args) {

        //去掉redundant字符
        String str="我要学学学编编编编编程程程程";

        //把重复第一个字符看做一组
        String regex="(.)\\1+";

        //$1表示把正则表达式第一组的内容拿出来用,因为在外部使用需要$1
        //每一组都按照左边的括号开始划分
        System.out.println(str.replaceAll(regex, "$1"));

        //?:    ?相当于前面的数据,匹配时看整体,保存整体
        //?=    ?相当于前面的数据,匹配时看整体,保存前面
        //?!    ?相当于前面的数据,匹配时看整体(匹配这个整体之外的),
        //非捕获分组仅仅将数据括起来,它不占用组号
    }

正则表达式在字符串中的应用  

public static void main(String[] args) {
        //字符串的校验
        //matches
        。。。。。。。。。
        。。。。。。。。。
        。。。。。。。。。
        //字符串的替换
        String str="小明abcde小红abcde小刚abcde";
        //以前学过replace方法,使用字符进行全部替换
        String result=str.replaceAll("[\\w&&[^_]]+","vs");
        System.out.println(result);
        //字符串的切割,切割满足正则表达式的目标
        //会以数组的方式返回数据
        String[] arr=str.split("[\\w&&[^_]]+");
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

你可能感兴趣的:(java,爬虫)