美文网首页
Java基础day25笔记:正则表达式|网页爬虫

Java基础day25笔记:正则表达式|网页爬虫

作者: 楠楠喜欢泡枸杞 | 来源:发表于2019-03-01 10:45 被阅读0次

2019.7.10 21:24 二刷结束留念


    01-正则表达式(特点)

        今天说一个Java中比较重要的小知识点:正则表达式。

        什么叫正则表达式呢?

        我们可以简单理解为符合一定规则的表达式

        作用:用于专门操作字符串。

        对字符串操作既便捷又简单的方式,就是正则表达式。

        接下来我们通过一个小小的需求,来初步感受一下~

        需求:

        代码:

        运行:

        测试长度不对:

        测试以0开头:

        测试包含非法字符:

        可是这个判断过程非常麻烦。

        校验非法字符我们可以让Java帮我们去完成,没必要非要自己写:

        可是,即使改到这个程度,还是很麻烦。

        这种方式,使用了String类中的方法,进行组合完成了需求,但是代码过于复杂。

        我们下面用正则表达式完成一下:

        原来代码可以这么简单~

        这就是正则表达式的威力。

    02-正则表达式(匹配)

        正则表达式的特点:

        用一些特定的符号来表示一些代码操作,这样就简化了书写。                                                      所以学习正则表达式,就是在学习一些特殊符号的使用。

        正则表达式是专门用于操作字符串的,那么它对字符串具体有哪些操作功能呢?

        具体操作功能: 

        1,匹配:String       matches方法:用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。  

        2,切割:String      split方法

        3,替换:String      replaceAll方法

        4,获取:将字符串中符合规则的子串取出。

        部分规则:

        先说匹配。

        一些例子:

        对电话号码的规则:

    03-正则表达式(切割)

        String类中有个方法叫split:

         之前我们的切法都很简单,现在我们可以用一些复杂的方式去切。 

        示例:

        我们发现它切了7次,连空格也切了,而我们只想取有效字符串,该怎么做呢。    

        我们分析一下要匹配的部分,它的特点是多个空格,所以这样写就好啦:

        再试试拿“.”切:

        但是没切着:

        为什么呢?

        这个里面接收的是正则表达式:

        而“.”是一个特殊符号,代表任意字符,所以不能用“.”去切东西。

        如果非想用“.”切呢?

        我们转义一下:

        但是挂掉了:

        “.”是正则表达式的符号,“\.”放在字符串中还是正则表达式的符号,所以我们需要再给它转义一下: 

        这次就OK了。

        下面我们想用双反斜杠“\\”切割下面的文件路径:

        为什么要这么写呢,这么多反斜杠。。。

        可是结果表明这种写法是正确的:

        我们来分析一下,文件路径原本是单斜杠“\”的,但是“\”会将后面的字符转义:

        所以得给“\”前面加个“\”转义,转义后它才代表一个“\”:

        同理,文件路径中的单斜杠也要被转义,然后我们对这两个单斜杠每个都要转义一次,就成了四个单斜杠:

        下面演示个更牛的。

        我们想用叠词将字符串拆开:

        什么叫叠词呢,就是后一个和前一个是一致的,那我们怎么表示后一个和前一个是一致的呢?

        既然前后是一致的,那么第一个位置的字符就是在被第二个位置重用,这个时候我们就用正则表达式中一个非常强的概念:组。

        我们把这个要重用的部分用小括号括起来:

        这叫做封装成了一个组,组封装好之后会有一个自动的编号,从第一组开始。接下来,第二个位置和第一组的内容是一致的,我们怎么去使用第一组呢?

        “1”代表引用第一组:

        可是“1”是一个普通的字符,于是我们用“\”转义一下:

        封装成字符串以后,还得再多加一个“\”:

        OK,完整的写法是这样的:

        那如果不止叠两次,叠多次呢?

        我们只需要在后面加上“+”,代表第二个位置会出现1次或多次:

        总结一下:

        为了让规则的结果被重用,可以将规则封装成一个组,用()完成。组的出现都有编号,从1开始,想要使用已有的组可以通过\n(n就是组的编号)的形式来获取。      

        下面这个组里有几个组呢?第一个组、二个组、...分别是哪个呢?  

        有个数的办法:先数左括号有几个,就有几个组。然后,第一个左括号所在的组就是第一个组,第二个左括号所在的组就是第二个组,以此类推。

        Java API中也有描述:

        说到这里,正则表达式的弊端也出来了:

        符号定义越多,正则越长,阅读性越差。

    04-正则表达式(替换)

        我们的目标是,将数字替换成#:

        将叠词替换成&:

        将重叠的字符替换成单个字母:

       注意,获取前一个规则中的组,用$这个符号,和获取本规则中的组的符号是不同的。

    05-正则表达式(获取)

        获取的操作步骤:

        1,让正则表达式封装成对象。

        2,让正则对象和要操作的字符串相关联。

        3,关联后,获取正则匹配引擎。

        4,通过引擎对符合规则的子串进行操作,比如取出。

        我们接下来根据这个思路来写代码:

        Matcher具有很多很多的方法:

        我们用一下find方法和group方法,可以返回满足规则的子串:

        只返回了一个,我们想返回全部的,这个时候就可以用while(m.find())循环,就会返回全部的。

        下面我们返回字符串中指定个数的连续单词:

        介绍一个小东西,边界匹配器:

        OK,下面这段代码就是返回了长度为3的单词:

        运行略。

        下面这段是返回长度为4的单词,并且我们调用m.start方法和m.end方法,返回了单词的索引:

        获取到了子串的索引位置:

        加一句代码,看看运行结果有什么不同:

        分析一下运行结果,因为这是一串很长的字符串,不满足是4个连续字母的规则,所以matches的结果是false。我们发现,后面调用find方法获取到的单词中,没有了ming,因为matches的时候,索引已经指到了4,所以再调用find方法的时候从4的下一个5号开始,因此find没有找到ming。

        通过这个测试,同一个匹配器用的是同一个索引位。

    06-正则表达式(练习1)

        我们来纠正一下口吃。

        代码如下:

        强调一下之前几节课学到东西的重点,那四种方式到底该什么时候用呢?

        1,如果只想知道该字符是否对或错,使用匹配

        2,想要将已有的字符串变成另一个字符串,使用替换

        3,想要按照自定的方式将字符串变成多个字符串,使用切割。获取规则以外的字符串。

        4,想要难道符合需求的字符串子串,使用获取。获取符合规则的子串。

    07-正则表达式(练习2)

        需求:

        接下来是另外一个练习,这个练习要求是必须掌握,因为开发的时候用的到。

    08-正则表达式(网页爬虫)

        这节课我们的目的是爬取网页中的信息,要求将网页中的邮箱地址爬取出来。

        在爬取网页信息之前,我们先获取一下文件中的邮箱地址。

        文件内容是这样的:

        代码:

        获取到了文件中的邮箱:

        接下来我们将文件中的内容写到网页中:

        其实获取的思路是一样的,只是数据源从文件变成了网络,新的代码:

        结果略。

        终于,day25 end.

        拖了好久好久的一场基础战,终于告一段落,虽然后期因为各种各样的事情包括我焦急的心态,好多地方写的都不够详细,甚至有大片的截屏粘贴,但是整个战线上还是坚持下来了。

        打好了基础,接下来就要巩固它,并进行新的全局规划~

        你在一步一步变更好呢φ(≧ω≦*)♪

相关文章

网友评论

      本文标题:Java基础day25笔记:正则表达式|网页爬虫

      本文链接:https://www.haomeiwen.com/subject/btyquqtx.html