当前位置: 首页 > 编程日记 > 正文

Java学习总结:38(正则表达式)

正则表达式

正则表达式本质上是一种字符串操作语法规则,利用它我们能更加灵活地实现字符串的匹配、拆分、替换等操作。

正则标记

所有的正则表达式支持的类都定义在java.util.regex包里面。这个包里面定义了如下两个主要的类:
1.Pattern类:主要定义要使用的表达式对象
2.Matcher类:用于进行正则标记与指定内容的匹配操作。

所有可以使用的正则标记都在java.util.regex.Pattern类说明文档中定义,常用的标记有如下6类:

1.单个字符(数量:1)

  • 字符:表示由一位字符组成;
  • \\\:表示转义字符“\”;
  • \t:表示一个“\t”符号;
  • \n:表示一个“\n”符号;

2.字符集(数量:1)

  • [abc]:表示可能是字符a、字符b、字符c中的任意一位;
  • [^abc]:表示不是字符a,b、c中的任意一位;
  • [a-z]:所有的小写字母;
  • [a-zA-Z]:表示任意的一位字母,不区分大小写;
  • [0-9]:表示任意的一位数字;

3.简化的字符集表达式(数量:1)

  • .:表示任意的一位字符;
  • \d:等价于“[0-9]”,属于简化写法;
  • \D:等价于“[^0-9]”,属于简化写法;
  • \s:表示任意的空白字符,例如:“\t”、“\n”;
  • \S:表示任意的非空白字符;
  • \w:等价于“[a-zA-Z_0-9]”,表示由任意的字母、数字、_组成;
  • \W:等价于“[a-zA-Z_0-9]”,表示不是由任意的字母、数字、_组成;

4.边界分配

  • ^:正则的开始;
  • $:正则的结束;

5.数量表达

  • 正则?:表示此正则可以出现0次或1次;
  • 正则+:表示此正则可以出现1次或1次以上;
  • 正则*:表示此正则可以出现0次、1次或多次;
  • 正则{n}:表示此正则正好出现n次;
  • 正则{n,}:表示此正则出现n次以上(包含n次);
  • 正则{n,m}:表示此正则出现n~m次;

6.逻辑运算

  • 正则1正则2:正则1判断完成后继续判断正则2;
  • 正则1|正则2:正则1或是正则2有一组满足即可;
  • (正则):将多个正则作为一组,可以为这一组单独设置出现的次数。

Pattern类常用方法

No.方法名称类型描述
1public static Pattern compile(String regex)普通编译正则表达式
2public String[] split(CharSequence input)普通数据全拆分操作
3public String[] split(CharSequence input,int limit)普通数据部分拆分操作
4public Matcher matcher(CharSequence input)普通取得Matcher类对象

注意:Pattern类没有定义构造方法,所以想要取得Pattern类对象,必须利用compile()方法进行正则表达式的编译操作。同时,因为在Pattern类中定义的方法,在进行参数接收时接收的都是CharSequence接口对象,所以只要是CharSequence接口的子类都可以进行正则操作。

例:利用Pattern类实现字符串拆分

package Project.Study.PatternClass;import java.util.Arrays;
import java.util.regex.Pattern;public class Test1 {public static void main(String[]args){String str="hello3232world32!!!";String regex="\\d+";Pattern pattern=Pattern.compile(regex);		//编译正则String[] result =pattern.split(str);		//拆分字符串System.out.println(Arrays.toString(result));}
}
//结果:
//[hello, world, !!!]

Matcher类常用方法

No.方法名称类型描述
1public boolean matches()普通正则匹配
2public String replaceAll(String replacement)普通全部替换
3public String replaceFirst(String replacement)普通替换首个

例:实现字符串验证操作

package Project.Study.MatcherClass;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test1 {public static void main(String[]args){String str="100";String regex="\\d+";Pattern pattern=Pattern.compile(regex);	//编译正则Matcher matcher=pattern.matcher(str);	//进行正则匹配System.out.println(matcher.matches());	//匹配结果}
}
//结果:
//true

String类对正则的支持

事实上,在实际开发中String类使用得较多,大部分情况下都会使用String类中提供的方法来直接简化正则操作,只有很少的情况下才会使用Pattern类和Matcher类操作正则。

String类与正则有关的5个操作方法

No.方法名称类型描述
1public boolean matches(String regex)普通正则验证,使用指定的字符串判断其是否符合给出的正则表达式结构
2public String replaceAll(String regex,String replacement)普通将满足正则标记的内容全部替换为新的内容
3public String replaceFirst(String regex,String replacement)普通将满足正则标记的首个内容替换为新的内容
4public String[] split(String regex)普通按照指定的正则标记进行字符串的全拆分
5public String[] split(String regex,int limit)普通按照指定的正则标记进行字符串的部分拆分

上面5个方法包括字符串的替换、拆分、验证操作,下面我们就来实现一下

例:实现字符串的替换

package Project.Study.Regex;public class Test1 {public static void main(String[]args){String str="hel12l32o232121wQo@#rl32d!!!";//给出一组混乱的字符串String regex="[^a-z]";		//编写正则,剔除所有不是小写字母的字符System.out.println(str.replaceAll(regex,""));//字符串替换}
}
//结果:
//helloworld

例:字符串的拆分

package Project.Study.Regex;public class Test2 {public static void main(String[]args){String str="hello090world3241!!!";String regex="\\d+";	//表示"[0-9]"一位以上的整数位,属于简化写法,因为是在字符串中定义的,所以用"\\"代替"\",属于转义字符操作String[] result =str.split(regex);for (String s : result) {System.out.println(s);	//输出分隔好的字符串}}
}
//结果:
//hello
//world
//!!!

正则验证的应用

若是字符串是带小数点".“的数字呢(小数点”."在正则中表示任意字符),我们又应该怎么将其转换为浮点型数据?
例:将字符型数字转换为浮点型数据

package Project.Study.Regex;public class Test3 {public static void main(String[]args){String str1="10.01";String str2="10.10";String regex="\\d+(\\.\\d+)?";if(str1.matches(regex)){		//转型前要进行验证System.out.println(Double.parseDouble(str1));}if(str2.matches(regex)){		//转型前要进行验证System.out.println(Double.parseDouble(str2));}}
}
//结果:
//10.01
//10.1

上程序中的正则解析:
在这里插入图片描述
上程序中的"?"表示该小数位可能出现0次或1次。
上程序中使用了matches()方法进行正则验证,同理,我们也可以用它来判断其他,例如:IP地址

例:

package Project.Study.Regex;public class Test4 {public static void main(String[]args){String str1="192.168.1.1";String str2="192.1683.1.1";String regex1="\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";//该正则中的"\\d{1,3}"表示1~3位数字String regex2="(\\d{1,3}\\.){3}\\d{1,3}";		//简化正则操作System.out.println(str1.matches(regex1));System.out.println(str1.matches(regex2));System.out.println(str2.matches(regex1));System.out.println(str2.matches(regex2));}
}//结果:
//true
//true
//false
//false

例:判断日期格式是否正确

package Project.Study.Regex;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class Test5 {public static void main(String[]args) throws ParseException {String str="2013-8-15";String regex="\\d{4}-\\d{1,2}-\\d{1,2}";	//定义验证正则if(str.matches(regex)){						//符合规则Date date=new SimpleDateFormat("yyyy-MM-dd").parse(str);System.out.println(date);}}
}
//结果:
//Thu Aug 15 00:00:00 CST 2013

相关文章:

PHP Multipart/form-data remote dos Vulnerability

catalog 1. Description 2. Analysis 1. Description PHP is vulnerable to a remote denial of service, caused by repeatedly allocate memory、concatenate string、copy string and free memory when PHP parses header areas of body part of HTTP request with multipar…

HTTP的KeepAlive是开启还是关闭?

转自:http://blog.csdn.net/gaogaoshan/article/details/38580013 1、KeepAlive的概念与优势 HTTP的KeepAlive就是浏览器和服务端之间保持长连接,这个连接是可以复用的。当客户端发送一次请求,收到相应内容后,这个连接会保持一段时…

MyBatis中jdbcType=INTEGER、VARCHAR作用

Mapper.xml中 pid #{pid,jdbcTypeINTEGER} pid #{pid} 都可以用 Mybatis中什么时候应该声明jdbcType? 当Mybatis不能自动识别你传入对象的类型时。 什么情况下,Mybatis不能自动识别我的传入类型? 例如:当你传入空值的时候。&…

我让老师失去了孩子

我永远也忘不了我的初中班主任是被我们班气得流产的。她教我们历史,中考前那段日子,由于学业紧张,学校又没特殊安排,她天天挺着大肚子给我们讲课,只有偶尔请假离开去医院检检查。我们班成绩不好,学习气氛差…

3D场景高级合成技术学习

MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch |语言:英语中英文字幕(根据原英文字幕机译更准确)|时长:3h 47m |大小解压后:3.61 GB 含课程文件 创建和渲染三维场景是一项艰巨的任务。但是当你需要在渲染…

Java学习总结:39(反射机制)

反射机制 JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制。 Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它…

perl 编程 - 判断系统进程是否活着的方法

2019独角兽企业重金招聘Python工程师标准>>> 前言:我在使用perl编写CGI程序时遇到的一些问题,解决以后,记录一下我的心得,有心的朋友们会从中得到帮助并养成正确使用的好习惯。 perl编程中判断系统进程是否存活的方法…

2009 Competition Highlights by ICPC Live

2009 Competition Highlights by ICPC Live Links:http://www.youtube.com/watch?vn0oZRcAz6w0 转载于:https://www.cnblogs.com/yewei/archive/2012/09/07/2674862.html

C4D灯光照明技术学习教程

C4D的灯光照明技术 大小解压后:4.8G 学会用Redshift点亮3D场景,像专业人士一样塑造光线 灯光在任何空间都是至关重要的,无论是真实的还是虚拟的。它能够传递某种感觉或情感。平面设计师罗伯托冈萨雷斯观察到如此重要的方面,并将其…

Java学习总结:40(国际化)

国际化 所谓国际化程序指的是同一套程序代码可以在不同的国家使用,可以根据其应用的国家自动在项目中显示出本国的相应文字信息。 使用Locale类定义语言环境 Locale类的常用方法 No.方法类型描述1public Locale(String language,String country)构造设置使用的语…

AFNetWorking 队列请求

我们在开发过程中,经常会遇到有些页面不止一个网络请求,有时候需要两个三个甚至更多,这个时候我们就需要队列请求,下边是GET请求的多个请求放在队列里边: [objc] view plaincopyprint? NSURL *url [NSURL URLWithStr…

Hadoop-虚拟机环境准备

传送门:https://app.yinxiang.com/fx/4fdf4d09-ddc8-4c67-8bf7-cca1c913fce5

WCF实现RESTFul Web Service

共同学习了前面一些概念,终于开始正题了哈。RESTful的Web Service调用直观,返回的内容容易解析。这里先会描述一个简单的场景--Web Service提供一个方法来搜索个人信息,传入人名,返回完整个人信息。下面我们一步步用WCF实现一个RE…

VS QT插件

支持用VS编译qt工程 QT下载页:http://qt-project.org/downloads qt-vs-addin插件: http://download.qt-project.org/official_releases/vsaddin/qt-vs-addin-1.2.2-opensource.exe 转载于:https://www.cnblogs.com/Leo-Forest/p/3507017.html

使用AutoCAD 2021创建真实世界的土木设计项目

由工程组织创建|最后更新日期:2021年9月 时长:7h 24m | 7节| 64节讲座|视频:1280720,44 KHz | 大小解压后3 GB 流派:电子学习|语言:英语中英文字幕(根据原英文字幕机译更准确) 学会快速使用AutoCAD ;专业地制作真实世…

Java学习总结:41(文件操作类:File)

Java文件操作类:File 在java.io包中,如果要进行文件自身的操作(例如:创建、删除等),只能依靠java.io.File类完成。 File类的常用操作方法 No.方法类型描述1public File(String pathname)构造传递完整文件操作路径2public File(F…

关于大型网站技术演进的思考(四)-存储的瓶颈4

如果数据库需要进行水平拆分,这其实是一件很开心的事情,因为它代表公司的业务正在迅猛的增长,对于开发人员而言那就是有不尽的项目可以做,虽然会感觉很忙,但是人过的充实,心里也踏实。 数据库水平拆分简单说…

2022-2028年中国环卫行业产业链深度调研及投资前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国环卫行业市场行业相关概述、中国环卫行业市场行业运行环境、分析了中国环卫行业市场行业的…

curl命令具体解释

对于windows用户假设用Cygwin模拟unix环境的话,里面没有带curl命令,要自己装,所以建议用Gow来模拟,它已经自带了curl工具,安装后直接在cmd环境中用curl命令就可,由于路径已经自己主动给你配置好了。 linux …

如何修改配置以修复ThinkPad 小红帽滚轮失效?

本人使用ThinkPad X1 Carbon超级本,由于近期安装了遨游浏览器(Maxthon),发现其总体体验还是不错,但是在本机器上有个明显的Bug:就是小红帽的滚轮不管用。 由于就查了网上相关资料并加以试验,最终得以解决,方…

在虚幻引擎5中重塑火箭联盟——口袋联盟

流派:电子学习| MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz 语言:英语中英文字幕(根据原英文字幕机译更准确) |大小解压后:3.28 GB |时长:4h 21m 了解如何实现火箭联盟般的力学,并在短时间内创建最近的火箭…

Java学习总结:42(字节流和字符流)

字节流与字符流 上一节我们学习了文件操作类File,但是File类虽然可以操作文件,但是却不能操作文件的内容。如果要进行文件内容的操作,就必须依靠流的概念来完成。流在实际中分为输入流和输出流两种,输入流和输出流是一种相对的概…

用C#钩子写一个改键外挂

我的微信群——软件开发测试工程师交流群,欢迎扫码: 改键是一种习惯,比如在玩儿lol或者dota的时候。理论上玩儿什么游戏都可以改键。 做一个窗体(点击Install——应用改键,点击Uninstall——撤销应用)&…

Spring中WebApplicationContext

ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一 些,ApplicationContext则是“应用的容器”了:P,Spring把Bean放在这个容器中,在需要的时候,用getB…

洛谷 P1966 火柴排队

题意 给定2个等长序列a、b,要求通过交换使 \[\sum_{i1}^{n}(a_i-b_i)^2\] 最小。 分析 看着这个式子,我突然想到了方差。很明显,方差反应数据的波动程度,所以让数据集中就可以使方差变小了。而对应到这个公式,大方向就…

Revit结构2021-2022从零到精通

流派:电子学习| MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz 语言:英语中英文字幕(根据原英文字幕机译更准确) |大小解压后:8.6 GB 含课程文件 |时长:14h 46m 涵盖Revit结构2021-2022的基本、中级和高级功能 Revit Str…

BZOJ1922: [Sdoi2010]大陆争霸

题目:http://www.lydsy.com/JudgeOnline/problem.php?id1922 带限制最短路。 每个点真正的dis是max(dis[i],dis[v]),v是其保护点。 可以把题目中的保护转化为每个点的贡献。 每次扫一边连出的边做最短路把rd为0的点加入队列。 再扫一遍自己的贡献,更新它…

Java学习总结:43(转换流)

转换流 字节流和字符流的转换可以通过InputStreamReader、OutputStreamWriter两个类转换,下面是这两个类的继承结构和构造方法 名称定义构造构造方法InputStreamReaderpublic class InputStreamReader extends Readerpublic InputStreamReader(InputStream in)Out…

2022-2028年中国环保服务业投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国环保服务行业市场行业相关概述、中国环保服务行业市场行业运行环境、分析了中国环保服务行…

一个build.xml实例

<?xml version"1.0"?> <project name"ssh" basedir"." default"usage"> <property name"name" value"ssh"/> <property name"war.dir" value"war"/> &l…