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.
拖了好久好久的一场基础战,终于告一段落,虽然后期因为各种各样的事情包括我焦急的心态,好多地方写的都不够详细,甚至有大片的截屏粘贴,但是整个战线上还是坚持下来了。
打好了基础,接下来就要巩固它,并进行新的全局规划~
你在一步一步变更好呢φ(≧ω≦*)♪
网友评论