欢迎大家来到IT世界,在知识的湖畔探索吧!
“这里是云端源想IT培训,帮你轻松学IT”
嗨~ 今天的你过得还好吗?
你喜欢雨天吗?
风来听风,花开赏花,云飘看云,
雨天,也是对人最好的治愈。
– 2023.04.21 –
虽然今天是个下雨天,但是它并不影响我们学Java!小编又给大家准备了很干很干的干货,本文将从正则表达式的概念、底层实现、语法、常见应用等方面介绍Java正则表达式。快点收藏起来吧!
一、正则表达式是什么
正则表达式,又称规则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为”元字符”),是计算机科学的一个概念。
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,例如可以检查一个字符串是否含有某种子字符串、将匹配的子字符串做替换或者从某个字符串中取出符合某个条件的子字符串等。
二、正则表达式的底层实现
1.matcher.find()
正则表达式中用()表示分组,第1个()表示第1组,第2个()表示第2组…
(1)根据指定的规则,定位满足规则的子字符串。
(2)找到后,将子字符串的开始的索引记录到matcher对象的属性 int[] groups,把该子字符串的结束的索引的值+1记录到groups[1]中。
- groups[0]为子字符串开始的索引,groups[1]为该子字符串的结束的索引的值+1
- groups[2]为匹配到的该字符串第1组的开始索引,groups[3]为匹配到的该字符串第1组的结束索引+1
- groups[4]为匹配到的该字符串第2组的开始索引,groups[5]为匹配到的该字符串第2组的结束索引+1
- 依此类推……
(3)同时记录oldLast的值为该子字符串的结束的索引的值+1,即groups[1],即下次执行find时,就从groups[1]开始匹配。
2.matcher.groups()
(1)matcher.groups(0)根据groups[0]和groups[1]记录的位置,从content开始截取字符串返回索引为[groups[0],groups[1])的位置,即返回匹配到的子字符串。
(2)matcher.groups(1)返回匹配到的子字符串第1组的字符串,matcher.groups(2)返回匹配到的子字符串第2组的字符串,依此类推……
(3)如果你输入的group大于了分组数,会抛出IndexOutOfBoundsException异常。
三、正则表达式的语法
1.正则转义符
元符号-转义号\\:在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义字符,否则检测不到结果,甚至会报错。
需要用到转义符的字符有:. * + ( )$ / \ ? [ ] ^ { }
注意:在Java的正则表达式中,两个\\代表其他语言中的一个\
2. 正则表达式支持字符
正则表达式所支持的合法字符
正则表达式中的特殊字符
预定义字符
方括号表达式
- 表示枚举:例如,[abc]表示 a、b、c 其中任意一个字符;[gz]表示 g、z 其中任意一个字符 。
- 表示范围:– 例如,[a-f]表示 a~f 范围内的任意字符; [\\u0041-\\u0056]表示十六进制字符 \u0041 到 \u0056 范围的字符。
范围可以和枚举结合使用,如 [a-cx-z],表示 a~c、x~z 范围内的任意字符。
- 表示求否:^ 例如,[^abc]表示非 a、b、c 的任意字符;[^a-f]表示不是 a~f 范围内的任意字符。
- 表示“与”运算:&& 例如,[a-z&&[def]]是 a~z 和 [def] 的交集,表示 d、e;f[a-z&&^bc]]是 a~z 范围内的所有字符,除 b 和 c 之外;[ad-z] [a-z&&[m-p]]是 a~z 范围内的所有字符,除 m~p 范围之外的字符。
- 表示“并”运算:并运算与前面的枚举类似。例如,[a-d[m-p]]表示 [a-dm-p]。
边界匹配符
^ 行的开头 $ 行的结尾 \b 单词的边界 \B 非单词的边界 \A 输入的开头 \G 前一个匹配的结尾 \Z 输入的结尾,仅用于最后的结束符 \z 输入的结尾。
三种模式的数量表示符
补充:
Java正则表达式默认是区分字母大小写的,如要实现不区分大小写:
- (?i)abc表示abc都不区分大小写;
- a(?i)bc表示bc不区分大小写;
- a((?i)b)c表示只有b不区分大小写。
3.捕获组
(1)捕获组是把多个字符当成一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。
捕获组通过从左到右计算其括号来编号。
例如:在表达式((A)(B(C))) 中,存在四个这样的组:
((A)(B(C)))
(A)
(B(C))
(C)
(2)捕获组可以通过调用matcher对象的groupCount方法来查看表达式有多少个分组。(groupCount方法返回一个int值,来表示matcher对象当前有多少个捕获组)。
(3 )还有一个特殊的组零(group(0)),它代表整个表达式。(该组不包括在groupCount的返回值中)。
(4)以 (?) 开头的组是纯的非捕获组,它不捕获文本,也不针对组合计进行计数。
四、正则表达式的常见应用
1.验证字符串是否全是汉字
设置Pattern pattern=Pattern.compile(“^[\u0391-\uffe5]+#34;);
2.验证字符串是否是邮编
设置Pattern pattern=Pattern.compile(“^\\d{6}#34;);
3.验证字符串是否是号码
设置Pattern pattern=Pattern.compile(“^[1-9]d{4,9}#34;);
4.验证字符串是否是手机号码
(要求:必须以13,14,15,18开头的11位数)
设置Pattern pattern=Pattern.compile(“^1[3|4|5|8]\\d{9}#34;);
5. 验证字符串是否是url
设置Pattern pattern=Pattern.compile(“^((http|https)://)([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/%.#]*)?#34;);
五、正则表达式常用三个类
1.Pattern类
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
matches()方法
2.Matcher类
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
1)索引方法
索引方法提供了有用的索引值,精确表明输入字符串中在哪能找到匹配:
2)查找方法
查找方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式:
3)替换方法
替换方法是替换输入字符串里文本的方法:
3.PatternSyntaxException类
PatternSyntaxException 是一个非强制异常类,它指示一个正则表达式模式中的语法错误。
PatternSyntaxException 类提供了下面的方法来帮助我们查看发生了什么错误。
- public String getDescription() 获取错误的描述。
- public int getIndex() 获取错误的索引。
- public String getPattern() 获取错误的正则表达式模式。
- public String getMessage() 返回多行字符串,包含语法错误及其索引的描述、错误的正则表达式模式和模式中错误索引的可视化指示。
六、反向引用
1.分组
我们可以用圆括号组成一个比较复杂的匹配模式,那么一个圆括号的部分我们可以看作是一个子表达式/一个分组。
2.捕获
把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。组0代表的是整个正则式。
3.反向引用
圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个我们称为反向引用,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部,内部反向引用\\分组号,外部反向引用$分组号。
例如:
(1)要匹配两个连续的相同数字:(\\d)\\1
(2)要匹配五个连续的相同数字:(\\d)\\1{4}
(3)要匹配个位与千位相同,十位与百位相同的数,例如1221,6556:(\\d)(\\d)\\2\\1
(4)结巴去重案例,例如要将”我我要学学学学编程!”简化成”我要学编程”:
content=Pattern.compile(“(.)\\1+”).matcher(content).replace(“$1”);
今天的分享就到这里了,更多IT技术知识、Java学习干货记得常来看我!
我们下期再见!
END
文案编辑|云端学长
文案配图|云端学长
内容由:云端源想分享
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/81988.html