JAVA正则表达式的基本使用教程
正则表达式语法
最简单的正则表达式就是字符串,比如hello world也是一个正则表达式,匹配"hello world"字符串。在这基础上我们加入其他符号表示,以满足我们匹配一定格式的字符串而不是与正则表达式一模一样的字符串,这些符号可以大致分为[]、{}、(),而其他的一些符号(如.,+,*,\\d等等)其实都可以认为是他们的简写形式。
[]
[]表示匹配一个在[]中包含的任一字符,如[abc]表示匹配a或者b或者c。
可以使用-来表示一个字符区间,[a-c]与[abc]是等效的;同时可以写多个区间,也可以写完区间后再加入字符,如[a-z0-9A]表示匹配a-z或者0-9或者A中的任一字符;
可以使用^来取补集,即[^a-c]表示匹配除了abc的其他任何字符、[^0-9]表示匹配除了数字的任何字符、[^a]表示匹配除了a的其他任何字符;
一些与[]等效的简写方法:
简写 | 意义 |
---|---|
. | 匹配除"\r\n"之外的任何单个字符。 |
\d | 数字字符匹配。等效于 [0-9]。 |
\D | 非数字字符匹配。等效于 [^0-9]。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。 |
\S | 匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。 |
\w | 匹配任何字类字符,包括下划线。与[A-Za-z0-9_]等效。 |
\W | 与任何非单词字符匹配。与[^A-Za-z0-9_]等效。 |
另外,由于java中**\\** 表示其他语言的一个\,所以上面的在java中均需要写成\\d、\\D等等。
{}
{}表示对其前面的字符或子表达式匹配的次数。
表达式 | 意义 |
---|---|
{n} | n 是非负整数。正好匹配 n 次。如o{2}匹配两次o |
{n,} | n 是非负整数。至少匹配 n 次。 |
{n,m} | m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。 |
表达式 | 意义 |
---|---|
* | 零次或多次匹配前面的字符或子表达式,等效于 {0,}。 |
+ | 一次或多次匹配前面的字符或子表达式, 等效于 {1,}。 |
? | 零次或一次匹配前面的字符或子表达式, 等效于 {0,1}。 |
()
()表示一个捕获组,由此可以使用()来将一个表达式拆分为多个组,实现将一个字符串中需要的信息提取出来。在()中的一开始加入?<name>可以实现对组命名,从而更方便地提取信息。
如(?[A-Za-z]+)表示一个至少由一个字母组成的人名,在获取匹配到的人名时只需要用matcher.group("name")即可得到匹配结果。
JAVA写法
模板
String pattern = "[a-z]+";//正则表达式 Pattern r = Pattern.compile(pattern);//将表达式编译 Matcher matcher = r.matcher(text);//将text字符串作为匹配的字符串 matcher.find();//匹配 value1 = matcher.group("value1");//提取信息
例子
描述
根据时间精度的不同,可能出现以下四种认定为正确的邮件信息格式:
username@domain-yyyy-mm-dd
例:lethean@buaa.edu.cn-2020-12-02
username@domain-yyyy-mm-dd-hh
例:myname-lethean@buaa.edu.cn-2020-12-02-15
username@domain-yyyy-mm-dd-hh:mimi
例:Lethean@buaa.edu.cn-2020-12-02-15:01
username@domain-yyyy-mm-dd-hh:mimi:ss
例:myname--lethean@buaa.edu.cn-2020-12-20-15:01:20
其中
username@domain 为
邮件发送者的邮箱地址
username 为用户名,domain 为域名
yyyy-mm-dd / yyyy-mm-dd-hh / yyyy-mm-dd-hh:mimi / yyyy-mm-dd-hh:mimi:ss 为
发送时间
‘y' 代表一位年份数字,‘m' 代表一位月份数字,‘d' 代表一位日期数字,‘h' 代表一位小时数字,‘mi' 代表一位分钟数字,‘s' 代表一位秒数数字
username 为只包含大小写字母、- 的长度不为零的字符串,对于大小写不敏感。
domain 为只包含大小写字母、数字、. 的长度不为零的字符串,对大小写敏感。
写法
String pattern = "(?<username>[A-Za-z-]+)@(?<domain>[A-Za-z0-9.]+)-(?<yyyy>\\d{4})-(?<mm>\\d{2})-(?<dd>\\d{2})(-)?(?<hh>\\d{2})?(:)?(?<mimi>\\d{2})?(:)?(?<ss>\\d{2})?"; String text = "myname--lethean@buaa.edu.cn-2020-12-20-15:01:20"; Pattern r = Pattern.compile(pattern); Matcher matcher = r.matcher(text); if (matcher.find()) { System.out.println("username:"+matcher.group("username")); System.out.println("domain:"+matcher.group("domain")); System.out.println("yyyy:"+matcher.group("yyyy")); System.out.println("mm:"+matcher.group("mm")); System.out.println("dd:"+matcher.group("dd")); System.out.println("hh:"+matcher.group("hh")); System.out.println("mimi:"+matcher.group("mimi")); System.out.println("ss:"+matcher.group("ss")); }
将text换成4种格式的邮箱均可得到正确结果,不存在的(hh、mimi、ss可能不存在)则为null。
运行结果如下:
username:myname--lethean
domain:buaa.edu.cn
yyyy:2020
mm:12
dd:20
hh:15
mimi:01
ss:20
如果以第3种格式输入,即text为Lethean@buaa.edu.cn-2020-12-02-15:01时,输出如下:
username:Lethean
domain:buaa.edu.cn
yyyy:2020
mm:12
dd:02
hh:15
mimi:01
ss:null
ss因为在该格式中没有所以为空。
例子改
描述
邮件信息输入格式改为:(ss:mimi:hh-)dd-mm-yyyy-username@domain-place
根据时间精度的不同,可能出现以下四种认定为正确的邮件信息格式:
dd-mm-yyyy-username@domain-place
例:02-12-2020-abc@buaa.edu.cn-Wuhu
hh-dd-mm-yyyy-username@domain-place
例:03-02-12-2020-abc@buaa.edu.cn-wuhu
mimi:hh-dd-mm-yyyy-username@domain-place
例:00:03-02-12-2020-abc@buaa.edu.cn-Wuhu
ss:mimi:hh-dd-mm-yyyy-username@domain-place
例:01:00:03-02-12-2020-abc@buaa.edu.cn-wuhu
place 是新加的域,表示地点,由英文字母组成,对大小写敏感,即 Beijing 和 beijing 视为不一样的地点
写法
String pattern = "(((?<ss>\\d{2}):)?((?<mimi>\\d{2}):))?((?<hh>\\d{2})-)?(?<dd>\\d{2})-(?<mm>\\d{2})-(?<yyyy>\\d{4})-(?<username>[A-Za-z-]+)@(?<domain>[A-Za-z0-9.]+)-(?<place>[A-Za-z]+)"; String text = "01:11:03-02-12-2020-abc@buaa.edu.cn-wuhu"; Pattern r = Pattern.compile(pattern); Matcher matcher = r.matcher(text); if (matcher.find()) { System.out.println("username:"+matcher.group("username")); System.out.println("domain:"+matcher.group("domain")); System.out.println("yyyy:"+matcher.group("yyyy")); System.out.println("mm:"+matcher.group("mm")); System.out.println("dd:"+matcher.group("dd")); System.out.println("hh:"+matcher.group("hh")); System.out.println("mimi:"+matcher.group("mimi")); System.out.println("ss:"+matcher.group("ss")); System.out.println("place:"+matcher.group("place")); }
注意前面的(((?<ss>\\d{2}):)?((?<mimi>\\d{2}):))?必须为嵌套的形式,否则匹配时会出现把mimi匹配成ss的错误(因为两者的匹配格式相同,先匹配给了ss,但是嵌套之后就不会出现这种情况)。
运行结果如下:
username:abc
domain:buaa.edu.cn
yyyy:2020
mm:12
dd:02
hh:03
mimi:11
ss:01
place:wuhu
如果将text改为11:03-02-12-2020-abc@buaa.edu.cn-wuhu,输出如下,ss不匹配。
username:abc
domain:buaa.edu.cn
yyyy:2020
mm:12
dd:02
hh:03
mimi:11
ss:null
place:wuhu
总结
到此这篇关于JAVA正则表达式使用的文章就介绍到这了,更多相关JAVA正则表达式内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 取双引号内的内容我们如果一个字符串中只有一个可以使用explode来获得,但如果有多个需要使用正则表达式来提取了,具体的例子如下。 写程序的时候总结一点经验,如何只...2016-11-25
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
- 这篇文章主要介绍了Vue 3.0 中 jsx 语法使用,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下...2020-11-13
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
- 今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
- 正则表达式是一门非常有用的并且进行模糊判断的一个功能了,我们下面来看通过正则来验证输入汉字、英语、数字,具体如下。 收藏了正则表达式。可以验证只能输入数...2016-11-25
- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03
- 常用的日期时间正则表达式 下面收藏了大量的日期时间正则匹配函数,包括分钟,时间与秒都能达到。 正则表达式 (?n:^(?=d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(...2016-11-25
- 这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29