java.util.regex包
Pattern类
(1)Pattern类的基本概念
'Pattern类的基本概念'
(1)Pattern类的中文名叫模式类,Pattern类的对象是一个模式。
(2)Pattern类中有一个字符串属性,其内保存的是模式包装的正则表达式。
(3)Pattern类中还有一个叫策略的属性,其内保存的是模式包装的策略。
(2)Pattern类的类图![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/716aa3b3d723d2e5b5f67224317473a3.png)
(3)Pattern类的属性
策略: 多行策略
'静态属性': BigDecimal.MULTILINE;int
'静态属性'
(1)该属性是一个int类型的变量,其值是8,它代表了模式的多行策略。
(2)多行策略是除了默认策略外,最常用的一个策略,除此以外其它的策略不用去学。
(3)多行策略会影响模式中定位符^和$的功能,除此之外其与默认策略无异。
(4)Pattern类的方法
常用方法一览表
(1)Pattern.compile(String regex);Pattern
(2)Pattern.matches(String regex,CharSequence input);boolean
(3)this.split(CharSequence input);String[]
(4)this.pattern();String
(5)this.toString();String
1.将正则表达式包装成模式
'静态方法': Pattern.compile(String regex);Pattern
'静态方法调用说明'
(1)该方法被调用后,jvm会将regex包装成模式并返回。
说明: 该模式所采用的策略是默认策略,默认策略是最常用的策略,它不会使模式包装正则表达式中的元字符含义改变。
(2)如果包装时发现regex接收的正则表达式内容不符合语法规则,则会抛出'模式语法异常'。
说明: 正则表达式的内容不符合规范时,可看笔记-正则表达式篇,里面将各种不符合语法规则的表达式给标记出来了。
(3)regex接收的值如果是null,则运行时会抛出'空指针异常'。
2.将正则表达式包装成模式,并指定模式的策略
'静态方法': Pattern.compile(String regex,int flags);Pattern
'静态方法调用说明'
(1)该方法被调用后,jvm会将regex包装成模式并返回。
说明: 该模式所采用的策略是根据flags传输来的数值决定的。
(2)如果包装时发现regex接收的正则表达式内容不符合语法规则,则会抛出'模式语法异常'。
说明: 正则表达式的内容不符合规范时,可看笔记-正则表达式篇,里面将各种不符合语法规则的表达式给标记出来了。
(3)regex接收的值如果是null,则运行时会抛出'空指针异常'。
(4)如果flags接收的值不代表任何一个策略,则运行时会抛出'非法参数异常'。
3.判断字符序列的内容是否能成为模式的目标字符串
'静态方法': Pattern.matches(String regex,CharSequence input);boolean
'静态方法调用说明'
(1)该方法被调用后,jvm会将regex包装成模式,该模式的策略是默认的,之后jvm会判断input的内容能否成为新建模式的目标字符串,如果能则返回true,不能则返回false。
(2)如果regex接收的正则表达式内容不符合语法规则,则会抛出'模式语法异常'。
说明: 正则表达式的内容不符合规范时,可看笔记-正则表达式篇,里面将各种不符合语法规则的表达式给标记出来了。
(3)regex接收的值如果是null,则运行时会抛出'空指针异常'。
(4)input接收的值如果是null,则运行时会抛出'空指针异常'。
4.以this的目标字符串为切割标准,切割字符序列的内容,并将切割得到的子内容作为元素正向保存在String[]数组内返回
'实例方法': this.split(CharSequence input);String[]
'实例方法调用说明'
(1)该方法被调用后,jvm会以this的目标字符串为切割标准,切割this的内容,并将切割得到的子内容作为字符串类型元素正向依次保存在String[]数组内返回。
(2)如果input的开头/末尾一个字符包含在this的目标字符串内,在进行切割时,不会切割出一个内容为""的字符串,而是会将开头/尾部字符舍去,其它地方是正常截取的。
(3)如果this的目标字符串是"",那么会返回将input内容中每个字符都作为元素的字符串数组。
(4)如果this的目标字符串是"",input的内容是"",则会返回元素个数为0的String[]数组。
(5)如果input接收的是null值,则程序运行时会抛出'空指针异常'。
5.将this包装的正则表达式返回
'实例方法': this.pattern();String
'实例方法调用说明'
该方法被调用后,jvm会将this包装的正则表达式返回。
6.将this转换成String类型返回
'实例方法': this.toString();String
'实例方法调用说明'
该方法被调用后,jvm会将this包装的正则表达式返回。
7.将this与文本都包装进新建匹配器中
'实例方法': this.matcher(CharSequence input);Matcher
'实例方法调用说明'
(1)该方法被调用后,jvm会将this和input包装进新建的匹配器中,其中this作为匹配器的模式属性,input作为匹配器的文本属性,最后会返回这个新建的匹配器。
(2)input如果接收null值,运行时会导致'空指针异常'。
Matcher类
(1)Matcher类的基本概念
'Matcher类的基本概念'
(1)Matcher类的中文名叫匹配器类,Matcher类的对象是一个匹配器。
(2)Matcher类中有如下两个重要的属性,它们分别代表着不同事物:
1.Pattern parentPattern属性,其内保存的是匹配器包装的模式。
2.CharSequence text属性,其内保存的是匹配器包装的文本。
(3)思维具象化:
1.我们可以将匹配器看作一个机器人,它手里拿着模式,脚下踩着的是文本。
2.机器人会按照程序员的要求也就是方法,进行各种操作。
3.机器人操作分为走动操作和非走动操作。
走动操作: 指的是机器人需要在文本上走动才能完成的操作。
不走动操作: 指的是机器人无需在文本上走动就能完成的操作。
(2)Matcher类的类图![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8b51ef34ef5995a07366ec78e8ff51f7.png)
(3)Matcher类的方法
常用方法一览表
============走动操作区==============
(1)this.reset();Matcher
(2)this.matches();boolean
(3)this.lookingAt();boolean
(4)this.find();boolean
(5)this.find(int start);boolean
(6)this.replaceFirst(String replacement);String
(7)this.replaceAll(String replacement);String
=============不走动区==============
(8)this.usePattern(Pattern newPattern);Matcher
(9)this.start(String name);int
(10)this.pattern();Pattern
(11)this.group();String
(12)this.start();int
(13)this.end();int
(14)this.group(int group);String
(15)this.start(int group);int
(16)this.end(int group);int
(17)this.group(String name);String
(18)this.start(String name);int
(19)this.end(String name);int
走动操作区==
1.要求机器人移动至文本开头字符处
'实例方法': this.reset();Matcher
'实例方法调用说明'
(1)该方法被调用后,机器人会移动至文本开头,如果已至文本开头则不动,之后再返回机器人的引用;
(2)如若机器人所踩文本或其拿模式包装的正则表达式的内容为"",则调用该方法时,最终结果是不可预期的,索性就将这种特殊情况禁了,此方法被调用时得保证不出现这种情况。
2.要求机器人判断其踩文本的整体内容是否为其拿模式的目标字符串
'实例方法': this.matches();boolean
'实例方法调用说明'
(1)该方法被调用后,机器人会移动至文本开头,如果已至文本开头则不动;
处于文本开头的机器人之后会拿着模式正向走完文本,一边走一边对照拿着的模式,哪怕中途已经发现其脚下踩的文本不是其拿模式的目标字符串,其也会走到文本末尾字符+1处再返回其判断结果。
(2)机器人如若返回的是true,则机器人在执行此方法后最终其所处位置是文本末尾字符+1处;机器人如若返回的是false,则机器人在执行此方法后最终其所处位置是文本开头字符处。
说明: 文本末尾字符+1处并不在文本范围内。
(3)如若机器人所踩文本或其拿模式包装的正则表达式的内容为"",则调用该方法时,最终结果是不可预期的,索性就将这种特殊情况禁了,此方法被调用时得保证不出现这种情况。
3.要求机器人判断其踩文本的开头内容是否为其拿模式的目标字符串
'实例方法': this.lookingAt();boolean
'实例方法调用说明'
(1)该方法被调用后,机器人会移动至文本开头,如果已至文本开头则不动;
处于文本开头的机器人之后会拿着模式朝着文本末尾走动,一边走一边对照拿着的模式:
分支1: 直至走到文本开头字符至当前脚下字符拼接后的内容不能成为其手拿模式的目标字符串,这时机器人会回退到前一个字符处,停下并返回其判断结果。
分支2: 直至走到文本末尾字符处,机器人会停下并返回其判断结果。
(2)机器人如若返回的是true,则机器人在执行此方法后最终其所处位置是机器人当前位置所踩字符+1处;机器人如若返回的是false,则机器人在执行此方法后最终其所处位置是文本开头字符处。
说明: 文本末尾字符+1处并不在文本范围内,机器人当前位置所踩字符+1处可以是文本末尾字符+1处。
(3)如若机器人所踩文本或其拿模式包装的正则表达式的内容为"",则调用该方法时,最终结果是不可预期的,索性就将这种特殊情况禁了,此方法被调用时得保证不出现这种情况。
4.要求机器人从当前所踩字符开始正向查找文本中的1个目标字符串
'实例方法': this.find();boolean
'实例方法调用说明'
(1)该方法被调用后,机器人会拿着模式从当前所踩字符开始向后走着,一边走一边对照拿着的模式,如若机器人途中找到了目标字符串,则机器人会将目标字符串与其在文本中的起始/结束索引都记录下来,并移动到结束索引+1处停下,之后返回true,表示找到了;
如若机器人直至文本末尾都没有找到目标字符串,则机器人移动到文本末尾字符+1处停下,并返回false,表示没找到。
说明1: 机器人执行该方法找到的目标字符串被称为当前匹配项。
说明2: 文本末尾字符+1处并不在文本范围内,结束索引+1处可以是文本末尾字符+1处。
(2)如若机器人所踩文本或其拿模式包装的正则表达式的内容为"",则调用该方法时,最终结果是不可预期的,索性就将这种特殊情况禁了,此方法被调用时得保证不出现这种情况。
5.要求机器人从指定索引位置向后查找文本中的1个目标字符串
'实例方法': this.find(int start);boolean
'实例方法调用说明'
(1)该方法被调用后,机器人会移动至文本start索引的字符处,如果已至文本start索引的字符处则不动;
处于文本start索引字符处的机器人之后会拿着模式从start索引字符处向着文本末尾处走动,一边走一边对照拿着的模式,如若机器人途中找到了目标字符串,则机器人会将目标字符串与其在文本中的起始/结束索引都记录下来,并移动到结束索引+1处停下,之后返回true,表示找到了;
如若机器人直至文本末尾都没有找到目标字符串,则机器人移动到文本末尾字符+1处停下,并返回false,表示没找到。
说明1: 机器人执行该方法找到的目标字符串被称为当前匹配项。
说明2: 文本末尾字符+1处并不在文本范围内,结束索引+1处可以是文本末尾字符+1处。
(2)如若机器人所踩文本或其拿模式包装的正则表达式的内容为"",则调用该方法时,最终结果是不可预期的,索性就将这种特殊情况禁了,此方法被调用时得保证不出现这种情况。
(3)如若start接收的值小于0,则运行时抛出'索引越界异常'。
(4)如若start接收的值大于构成文本的字符数量,则运行时抛出'索引越界异常'。
6.要求机器人将文本中首个目标字符串替换成指定字符串
'实例方法': this.replaceFirst(String replacement);String
'实例方法调用说明'
(1)该方法被调用后,机器人会移动至文本开头,如果已至文本开头则不动;
处于文本开头的机器人之后会拿着模式朝着文本末尾走动,一边走一边对照拿着的模式,如若机器人途中找到了目标字符串,则机器人会将目标字符串的内容替换成replacement的内容, 并在第一个目标字符串结束索引+1处停下,返回被替换内容后的文本,注意!原来文本内容不会改变,这里为了方便话语才说替换内容,记住这点就行了。
如若机器人直至文本末尾都没有找到目标字符串,则机器人移动到文本末尾字符+1处停下,并返回没有被动过内容的文本。
说明: 文本末尾字符+1处并不在文本范围内,目标字符串结束索引+1处可以与文本末尾字符+1处相同。
(2)如果replacement接收的是null值,则程序运行时会抛出'空指针异常'。
(3)如若机器人所踩文本或其拿模式包装的正则表达式的内容为"",则调用该方法时,最终结果是不可预期的,索性就将这种特殊情况禁了,此方法被调用时得保证不出现这种情况。
7.要求机器人将文本中的目标字符串全部替换成指定字符串
'实例方法': this.replaceAll(String replacement);String
'实例方法调用说明'
(1)该方法被调用后,机器人会移动至文本开头,如果已至文本开头则不动;
处于文本开头的机器人之后会拿着模式朝着文本末尾走动,一边走一边对照拿着的模式,如若机器人途中找到了目标字符串,则机器人会将目标字符串的内容替换成replacement的内容,往复如此,直至机器人走至文本末尾,则机器人会移动到文本末尾字符+1处停下,并返回被替换内容后的文本,注意!原来文本内容不会改变,这里为了方便话语才说替换内容,记住这点就行了。
说明1: 如若机器人一次都没更改过文本的内容,则该方法返回的字符串是原封不动的文本内容。
说明2: 文本末尾字符+1处并不在文本范围内,目标字符串结束索引+1处可以与文本末尾字符+1处相同。
(2)如果replacement接收的是null值,则程序运行时会抛出'空指针异常'。
(3)如若机器人所踩文本或其拿模式包装的正则表达式的内容为"",则调用该方法时,最终结果是不可预期的,索性就将这种特殊情况禁了,此方法被调用时得保证不出现这种情况。
=不走动区==
8.要求机器人变更手里拿着的模式
'实例方法': this.usePattern(Pattern newPattern);Matcher
'实例方法调用说明'
(1)该方法被调用后,机器人会将其手里拿的模式更改为newPattern接收的对象。
(2)如果newPattern接收的是null值,则程序运行时会抛出'非法参数异常'。
9.要求机器人变更脚下踩着的文本
'实例方法': this.start(String name);int
'实例方法调用说明'
(1)该方法被调用后,机器人会将其脚下踩的文本更改为name接收字符串的内容。
(2)如果name接收的是null值,则程序运行时会抛出'空指针异常'。
10.要求机器人将手里拿着的模式返回
'实例方法': this.pattern();Pattern
'实例方法调用说明'
该方法被调用后,机器人会将其手里拿的模式返回。
11.要求机器人返回记录的当前匹配项
'实例方法': this.group();String
'实例方法调用说明'
(1)该方法被调用后,机器人会将其记录的当前匹配项返回。
(2)如果当前匹配项不存在,也就是在调用该方法时,机器人还没有记录过当前匹配项,则运行时会抛出'非法状态异常'。
12.要求机器人返回当前匹配项在文本中的起始索引
'实例方法': this.start();int
'实例方法调用说明'
(1)该方法被调用后,机器人会将其记录当前匹配项在文本中的起始索引返回。
(2)如果当前匹配项在文本中的起始索引不存在,也就是在调用该方法时,机器人还没有记录过当前匹配项在文本中的起始索引,则运行时会抛出'非法状态异常'。
13.要求机器人返回当前匹配项在文本中的结束索引
'实例方法': this.end();int
'实例方法调用说明'
(1)该方法被调用后,机器人会将其记录当前匹配项在文本中的结束索引返回。
(2)如果当前匹配项在文本中的起始索引不存在,也就是在调用该方法时,机器人还没有记录过当前匹配项在文本中的结束索引,则运行时会抛出'非法状态异常'。
14.要求机器人根据组号
返回当前匹配项中对应的子串
'实例方法': this.group(int group);String
'实例方法调用说明'
(1)该方法被调用后,机器人会将group接收数值当作组号,返回当前匹配项中对应的子串。
(2)如果group接收的值是0,则该方法返回的是机器人当前记录匹配项。
(3)如果当前匹配项不存在,也就是在调用该方法时,机器人还没有记录过当前匹配项,则运行时会抛出'非法状态异常'。
(4)如果group接收的值作为组号后,该组号在机器人手拿模式包装的正则表达式中没有对应的捕获分组,则运行时会抛出'索引越界异常'。
15.要求机器人根据组号
返回当前匹配项中对应子串在文本中的起始索引
'实例方法': this.start(int group);int
'实例方法调用说明'
(1)该方法被调用后,机器人会将group接收数值当作组号,返回当前匹配项中对应子串在文本中的起始索引。
(2)如果group接收的值是0,则该方法返回的是机器人记录当前匹配项在文本中的起始索引。
(3)如果当前匹配项不存在,也就是在调用该方法时,机器人还没有记录过当前匹配项,则运行时会抛出'非法状态异常'。
(4)如果group接收的值作为组号后,该组号在机器人手拿模式包装的正则表达式中没有对应的捕获分组,则运行时会抛出'索引越界异常'。
16.要求机器人根据组号
返回当前匹配项中对应子串在文本中的结束索引
'实例方法': this.end(int group);int
'实例方法调用说明'
(1)该方法被调用后,机器人会将group接收数值当作组号,返回当前匹配项中对应子串在文本中的结束索引。
(2)如果group接收的值是0,则该方法返回的是机器人记录当前匹配项在文本中的结束索引。
(3)如果当前匹配项不存在,也就是在调用该方法时,机器人还没有记录过当前匹配项,则运行时会抛出'非法状态异常'。
(4)如果group接收的值作为组号后,该组号在机器人手拿模式包装的正则表达式中没有对应的捕获分组,则运行时会抛出'索引越界异常'。
17.要求机器人根据组名
返回当前匹配项中对应的子串
'实例方法': this.group(String name);String
'实例方法调用说明'
(1)该方法被调用后,机器人会将name接收字符串内容当作组名,返回当前匹配项中对应子串。
(2)如果当前匹配项不存在,也就是在调用该方法时,机器人还没有记录过当前匹配项,则运行时会抛出'非法状态异常'。
(3)如果name接收的值是null,则运行时会抛出'空指针异常'。
(4)如果name接收字符串内容作为组名后,该组名在机器人手拿模式包装的正则表达式中没有对应的捕获分组,则运行时会抛出'非法参数异常'。
18.要求机器人根据组名
返回当前匹配项中对应子串在文本中的起始索引
'实例方法': this.start(String name);int
'实例方法调用说明'
(1)该方法被调用后,机器人会将name接收字符串内容当作组名,返回当前匹配项中对应子串在文本中的起始索引。
(2)如果当前匹配项不存在,也就是在调用该方法时,机器人还没有记录过当前匹配项,则运行时会抛出'非法状态异常'。
(3)如果name接收的值是null,则运行时会抛出'空指针异常'。
(4)如果name接收字符串内容作为组名后,该组名在机器人手拿模式包装的正则表达式中没有对应的捕获分组,则运行时会抛出'非法参数异常'。
19.要求机器人根据组名
返回当前匹配项中对应子串在文本中的起始索引
'实例方法': this.end(String name);int
'实例方法调用说明'
(1)该方法被调用后,机器人会将name接收字符串内容当作组名,返回当前匹配项中对应子串在文本中的结束索引。
(2)如果当前匹配项不存在,也就是在调用该方法时,机器人还没有记录过当前匹配项,则运行时会抛出'非法状态异常'。
(3)如果name接收的值是null,则运行时会抛出'空指针异常'。
(4)如果name接收字符串内容作为组名后,该组名在机器人手拿模式包装的正则表达式中没有对应的捕获分组,则运行时会抛出'非法参数异常'。