JAVA学习之爬虫

Pattern:表示正则表达式

Mathcer:文本匹配器,按照正则表达式的规则去读取字符串

匹配语法:

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

Matcher m = p.matcher("要查询的大字符串"); //获取文本匹配器对象

boolean result = m.find(); //调用find方法将查询的结果返回,索引会停留在第一次找到的地方,如果要遍历完大字符串的内容,需要使用循环

String str = m.group(); //该方法底层是根据find记录的索引进行字符串截取 

因此,如果想要将大字符串中所有符合正则表达式的内容截取出来,代码如下所示:

应用场景1:本地爬虫

Pattern p = Pattern.compile("正则表达式"); 

Matcher m = p.matcher("要查询的大字符串"); 

String[] arr ;

while(m.find()){

        String str = m.group();

        System.out.println(str);

}

应用场景2:爬取网页中的特定字符串

        //创建一个URL对象
        URL url = new URL("输入要爬取的网页");
        //连接上这个网址
        URLConnection conn = url.openConnection();
        //创建一个对象去读取网络中的数据
        BufferedReader br = new BufferedReader(new  InputStreamReader(conn.getInputStream()));
        String line;
        //创建pattern对象存储正则表达式
        String regex = "正则表达式";
        Pattern p = Pattern.compile(regex);
        while ((line = br.readLine()) != null){
            //System.out.println(line);
            //按照pattern的规则,将文本匹配器和网络数据进行匹配截取
            Matcher m = p.matcher(line);
            while (m.find()){
                System.out.println(m.group());
            }
        }
        br.close();

关于正则表达式的一些小技巧:

1、"?i":表示忽略大小写

2、"?=":表示查询后面跟随的数据,但是获取的时候只要"?="前半部分

3、"?:":表示在获取时只要后面跟随的数据

4、"?!":表示在获取时不要后面跟随的数据

贪婪爬取与非贪婪爬取

贪婪爬取:在获取数据时尽可能多的获取数据

非贪婪爬取:在获取数据时尽可能少的获取数据

Java当中默认的就是贪婪爬取

贪婪匹配语法:只写"+"或者"*"

非贪婪匹配语法:"+?"或者是"*?"

贪婪匹配展示:

        String str = "我们经常说wtttttttttttttttttttf来表示震惊";
        String regex = "wt+";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()){
            String group = matcher.group();
            System.out.println(group); //wttttttttttttttttttt
        }

非贪婪匹配展示:

        String str = "我们经常说wtttttttttttttttttttf来表示震惊";
        String regex = "wt+?";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()){
            String group = matcher.group();
            System.out.println(group); //wt
        }

一些关于正则表达式在字符串方法中的使用:

1、public String[] matches(String regex) //判断字符串是否满足正则表达式

2、public String replaceAll(String regex, String newStr) //按照正则表达式的规则进行替换

3、public String[] split(String regex) //按照正则表达式的规则切割字符串

捕获分组和非捕获分组

一、捕获分组:把这一组的数据捕获出来,在使用一次

正则内部使用:\\组号

正则外部使用:$组号

关于捕获分组的练习

1、判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符。例:a123a   &123&

正则表达式为:"(.).+\\1" 

其中\\1表示把第1组的内容再拿出来用一次

使用方式为:"a123a".matches("(.).+\\1");  //true

2、判断一个字符串的开始部分和结束部分是否一致?可以有多个字符。例:abc123abc  bb235bb

正则表达式为:"(.+).+\\1"

使用方式为:"abc123abc".matches("(.+).+\\1");   //true

3、判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要保持一致。例:aaa123aaa   bbasdfgbb

正则表达式为:"((.)\\2*).+\\1"

其中,\\2表示将第二组的内容即(.)拿出来在使用一次,而*作用于\\2表示出现0次或多次,\\1表示将第一组的内容即((.)\\2*)拿出来在使用一次

二、非捕获分组:分组之后不需要再使用本组数据,仅仅是把数据括起来

(?:regex) :获取所有

(?=regex) :获取前面部分

(?!regex) :获取不是指定内容的前面部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值