Java正则表达式

目前所做的项目需要用到正则表达式,重新总结一下正则表达式。

正则表达式看似简单,实则门路颇多,究其原因也就是其太灵活了。完全掌握还是需要耗费一些功夫的。

一、正则表达式原字符

读者需对正则表达式元字符有一个初步的印象,实际应用时可以查阅文档。

正则表达式可以分为六类:限定符、选择匹配符、分组组合和反向引用符、字符匹配符、定位符、特殊字符

1、限定符转义符
字符 描述
\ 转义字符
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
* 匹配前面的子表达式零次或多次,等价于{0,}
+ 匹配前面的子表达式一次或多次,等价于{1,}
? 匹配前面的子表达式零次或一次,等价于{0,1}
{n} 匹配确定的n次
{n,} 至少匹配n次
{n,m} 最少匹配n次且最多匹配m次
{?} 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的
{n,} 至少匹配n次
{\b} 匹配一个单词边界
{\B} 匹配非单词边界
2、字符匹配符
字符 说明
[xyz] 匹配所包含的任意一个字符
[^xyz] 匹配未包含的任意字符
[a-z] 匹配指定范围内的任意字符
[^a-z] 匹配任何不在指定范围内的任意字符
##### 3、捕获分组非捕获分组
字符 描述
(pattern) 匹配pattern并获取这一匹配
(?:pattern) 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配
(?=pattern) 在任何匹配pattern的字符串开始处匹配查找字符串
4、特殊字符
字符 描述
. 匹配任何单词字符,除\n以外,要匹配包括“\n”在内的任何字符,请使用像“(.
\d 匹配一个数字字符。等价于[0-9]
\D 匹配一个数字字符。等价于[0-9]
\r 匹配一个换行
\s 匹配任何空白字符
\S 匹配任何非空白字符
\w 匹配包括下划线的任何单词字符
\W 匹配任何非单词字符
\t 匹配一个制表符
\W 匹配任何非单词字符
5、选择匹配符

x|y 匹配x或y

6、常用正则表达式
作用 表达式
电子邮箱 /^#?([a-f0-9]{6}
URL /^(https?://)?([\da-z.-]+).([a-z.]{2,6})([/\w .-]*)*/?$/

二、java中表达式的应用

java中对正则表达式的应用主要是两个类,下面是列出的一些常用方法,其中需要指明的是,这些都是静态方法。

1、Pattern类
  compile(String regex) 将给定的正则表达式编译为Matcher。
    
  matches(String regex, CharSequence input)直接匹配当前字符串
2、Matcher类
find(int start) 查找是否存在匹配

group(int group) 获取匹配分组

matches()  匹配当前字符串

start()  匹配开始位置

end(int group)  匹配结束位置

replaceAll(String replacement) 匹配替换

三、实例

1、使用java的正则表达式的一个简单应用
要求:提取出{abc}中的内容
 
 @Test
public void test11(){
  
   String str = "知情同意书签署日期 {zqdate}<yyyy/mm/dd>";
    String reg = "\\{+[a-z]?+\\}"; //  /<0=表0—入排标准>/--[0,2]
    //将规则封装成对象。
    Pattern p = Pattern.compile(reg);
    //让正则对象和要作用的字符串相关联。获取匹配器对象。
    Matcher m  = p.matcher(str);
    while(m.find())
    {
        System.out.println(m.group());
    }
}

结果
在这里插入图片描述

1、再整一个难活

有这样一串字符串在这里插入图片描述
仔细观察这段字符串是 a–a–a形式的 我要的是–部分,然后我这样写。
\/<\d=(.|\n)*\/<\d>\/
发现提取出来只有一部分。
在这里插入图片描述

仔细分析后发现,java默认是采用的贪婪模式。而这段字符串是 a–a–a形式的,它把我第
一个a和最后一个a当做是匹配的一整个。

解决这个问题也很简单,只需要这样写
在这里插入图片描述
在限定符*后面加一个?标识这是一个非贪婪模式,结果正常了,作为两部分返回了。
在这里插入图片描述

四、总结

相信读者能把这两个例子看懂正则表达式也能有一个初步的掌握,而成为一个正则表达式高手就需要靠你了。

掌握正则表达式一定要多写,只有写的多了才可以熟记于心,不会的多查阅文档。

学知识要知其然,知其所以然。

过去出问题了只会在百度搜索,然后在结果中一个个的尝试。

现在有问题了,一步步debug源码寻找问题的根源。希望读者都能逐渐转变学习方式。

即使看不懂源码的每一步,也能对整个过程有一个初步的认识,对于以后学习源码有极大的帮助。

有问题小伙伴们评论区见喔。

安利时刻:

image-20220714114938715


Java正则表达式
http://www.sky1998.cn/2022/03/17/Java/Java正则表达式/
作者
程序员田同学
发布于
2022年3月17日
许可协议