JAVA第五课:正则表达式
目录
- 序言
- 一、正则标记
- 二、正则表达式基础知识
- 1、主要包括以下三个类
- 2、弄清楚( )、[ ]、{ }的作用
- 三、应用实例
- 1、匹配
- 2、切割
- 3、替换
- 4、获取
- 5、示例
- 四、总结
序言
这周按照老师要求,我自学了关于java正则表达式的内容,发现正则表达式在编程中的作用很大,可以用来搜索、编辑或处理文本。现将学到的正则表达式的知识整理成文。
在编写处理字符串的程序或网页时,经常有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
Java中Spring.class涉及到正则表达式。如Spring.split(), matches(),replaceAll()等方法。
Java中更一般使用正则表达式的方式是利用Pattern.class和Matcher.class,所在package为java.util.regex
一、正则标记
1、字符
字符 | 说明 |
---|---|
B | 指定字符B |
\xhh | 十六进制值为oxhh的字符 |
\uhhhh | 十六进制值为oxhhhh的Unicode字符 |
\t | tab |
\n | 换行 |
\r | 回车 |
\e | 转义 |
2、字符类
字符类 | 说明 |
---|---|
. | 任意字符 |
[abc] | [ ] 中括号,包含a,b,c中任意字符 |
[^abc] | [ ]中括号加^, 表示否定,除a,b,c之外的 |
[a-z] | 从a到z的任意字符 |
[a-z&&[hi]] | &&表示交集,即包含h或i |
\s | 空白字符,包含空格,换行,回车,tab,换页 |
\S | 大写为小写的取反,非空白字符,等价于[^\s] |
\d | 数字0-9 |
\D | 非数字,等价于[^0-9] |
\w | 词字符,数字,大小写字母,等价于[0-9a-zA-Z] |
\W | 非词,等价于[^\w] |
3、逻辑操作符
逻辑操作符 | 说明 |
---|---|
XY | Y跟在X后面,并且XY同时满足 |
X | Y |
(X) | () 小括号表示捕获组(group),可以对group进行处理,尤其是获取其中的内容 |
4、边界匹配符
边界匹配符 | 说明 |
---|---|
^ | 匹配边界开始 |
$ | 匹配边界结束 |
\b | 词的边界 |
5、量词
量词描述了一个模式匹配文本的方式,包含
- 贪婪型:量词默认是贪婪的,发现尽可能多的匹配
- 勉强型:通过问号(?)指定,匹配最小的字符数,也称为懒惰型,最少匹配,非贪婪。
- 占有型:通过加号(+)指定,当用于字符串时防止匹配失败时回溯。
贪婪型 | 勉强型 | 占有型 | 说明 |
---|---|---|---|
X? | X?? | X?+ | 匹配0个或1个X |
X* | X*? | X*+ | 匹配0个或多个X |
X+ | X+? | X++ | 匹配1个或多个X |
X{n} | X{n}? | X{n}+ | 恰好匹配n个X |
X{n,} | X{n,}? | X{n,}+ | 至少匹配n个X |
X{n,m} | X{n,m}? | X{n,m}+ | 至少匹配n个X,最多匹配m个X |
二、正则表达式基础知识
1、主要包括以下三个类
- Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。 - Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。 - PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
2、弄清楚( )、[ ]、{ }的作用
圆括号()是组,主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理
示例:
1、(abc|bcd|cde),表示这一段是abc、bcd、cde三者之一均可,顺序也必须一致
2、(abc)?,表示这一组要么一起出现,要么不出现,出现则按此组内的顺序出现
3、(?:abc)表示找到这样abc这样一组,但不记录,不保存到变量中,否则可以通过变量中,否则可以通过变量中,否则可以通过x取第几个括号所匹配到的项,比如:(aaa)(bbb)(ccc)(?:ddd)(eee),可以用$1获取(aaa)匹配到的内容,而$3则获取到了(ccc)匹配到的内容,而$4则获取的是由(eee)匹配到的内容,因为前一对括号没有保存变量
4、a(?=bbb) 顺序环视 表示a后面必须紧跟3个连续的b
5、(?i:xxxx) 不区分大小写 (?s:.*) 跨行匹配.可以匹配回车符方括号是单个匹配,字符集/排除字符集/命名字符集
示例:
1、[0-3],表示找到这一个位置上的字符只能是0到3这四个数字,与(abc|bcd|cde)的作用比较类似,但圆括号可以匹配多个连续的字符,而一对方括号只能匹配单个字符
2、[^0-3],表示找到这一个位置上的字符只能是除了0到3之外的所有字符
3、[:digit:] 0-9 [:alnum:] A-Za-z0-9{}一般用来表示匹配的长度
示例:
1、\s{3} 表示匹配三个空格
2、\s{1,3}表示匹配一到三个空格
三、应用实例
1、匹配
匹配数字案例,用正则表达式来判断字符串中是否全部是数字:
String str = "123456789";
String reg = "\\d+";
boolean b= str.matches(reg);
System.out.println(b);
其中\d是正则表达式的匹配模式,为边界匹配器——单词边界。在java中\代表转义符,所以这里\d应该写成“\d”,后边的+是量词,代表前面的匹配出现的次数是一次或多次。
2、切割
String str = "张三.李四.王五";
String reg = "\\.";
String[] arr = str.split(reg);
System.out.println("切割得到的长度是:" + arr.length);
for(final String s : arr) {System.out.println(s);
}
上述的正则将字符串中以”.”为界限进行切割,得到一个字符串数组,切割得到的字符串放进字符串数组的元素中,下标从0开始。如上所述,输出的结果是:
切割得到的长度是:3
张三
李四
王五
- 如果字符串是以空格隔开,那么用的正则如下:
String reg = " +";
- 空白字符一般喜欢用\s来代替,所以如果是空格隔开,那么最好的用法如下:
String rege = "\s+";
- 切割重叠词,将叠词两边的字符串分割出来:
String str = "erkktyqqquizzzzzo";
String reg = "(.)\\1+";
String[] arr = str.split(reg);
System.out.println("切割得到的长度是:" + arr.length);for(final String s : arr) {System.out.println(s);}
将规则封装成一个组,用()完成。组的出现都有编号,从1开始,想要使用已有的组可以通过 \n(n是组的编号)的形式来获取。
3、替换
有这么一个字符串“wer1389980000ty1234564uiod234345675f”,将字符串中的数组替换成#。
public static void replaceAllDemo(String str,String reg,String newStr) {str = str.replaceAll(reg,newStr);System.out.println(str);
}replaceAllDemo(str,"\\d{5,}","#");
操作的步奏是,正则先去匹配字符串,如果找到匹配则替换。
替换叠词,将重叠的字符替换成单个字符,如:tt->t,调用的方法还是如上,传递的字符串和正则规则如下:
String str1 = "寻寻觅觅冷冷清清,凄凄惨惨戚戚,乍暖还寒时候,最难将息";
replaceAllDemo(str1,"(.)\\1+","$1");
4、获取
正则表达式的第四个功能:获取。将字符串中的符合规则的子串取出。这里必须去了解和使用JAVA封装的两个类:Matcher,Pattern。
String str = "Hello Rgex This is the test text!";
System.out.println(str);
String reg = "\\b[a-z]{4}\\b";//将规则封装成对象。
Pattern p = Pattern.compile(reg);//让正则对象和要作用的字符串相关联。获取匹配器对象。
Matcher m = p.matcher(str);System.out.println(m.matches());
其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。只不过被String的方法封装后,用起来较为简单。但是功能却单一。
public class RegexDemo {public static void main(String[] args) {getDemo();}public static void getDemo(){// 要验证的字符串String str = "Hello,Rgex,This,is,the,test,text!";// 正则表达式规则String reg = "[a-zA-Z]{2,4}";// 封装/编译正则表达式Pattern p = Pattern.compile(reg);// 忽略大小写的写法// Pattern pat =Pattern.compile(reg,Pattern.CASE_INSENSITIVE);//让正则对象和要作用的字符串相关联。获取匹配器对象。Matcher m = p.matcher(str);//输出结果while(m.find()) {String result = m.group();System.out.println(result);}}
}
操作步骤:
1.将正则表达式封装成对象。
2.让正则对象和要操作的字符串相关联。
3.关联后,获取正则匹配引擎。
4.通过引擎对符合规则的子串进行操作,比如取出。
5、示例
//以空格分割
String str1 = "1 2 3 4 54 5 6";
String[] numbers = str1.split(" +");
for (String temp : numbers) {System.out.println(temp);
}// 替换,替换所有的数字为*
String str2 = "abd123:adad46587:asdadasadsfgi#%^^9090";
System.out.println(str2.replaceAll("[0-9]", "*"));
System.out.println(str2.replaceAll("\\d", "*"));// 匹配出3个字符的字符串
String str = "abc 124 ewqeq qeqe qeqe qeqe aaaa fs fsdfs d sf sf sf sf sfada dss dee ad a f s f sa a'lfsd;'l";
Pattern pt = Pattern.compile("\\b\\w{3}\\b");
Matcher match = pt.matcher(str);
while (match.find()) {system.out.println(match.group());
}// 匹配出邮箱地址
String str2 = "dadaadad da da dasK[PWEOO-123- DASJAD@DHSJK.COM DADA@DAD.CN =0KFPOS9IR23J0IS ADHAJ@565@ADA.COM.CN shuqi@162.com UFSFJSFI-SI- ";
Pattern pet2 = Pattern.compile("\\b\\w+@\\w+(\\.\\w{2,4})+\\b");
Matcher match2 = pet2.matcher(str2);
while (match2.find()) {System.out.println(match2.group());
}
四、总结
正则就是记住规则,然后多加练习就能熟练掌握
JAVA第五课:正则表达式相关推荐
- Java第五课. 类对象
Java第五课. 类&对象 回顾 1. 冒泡:概念,实现:2个for循环分别起的作用 2. 二维数组可以理解成表格:有行有列,行当成一维数组,列当成一维数组中的元素,行有下标(几个一维数组), ...
- Java第五课:类和对象
Java第五课:类和对象 Java第五课:类和对象 1.1 上周回顾 1.2 作业讲解 1.3 类和对象: 1.4 面向对象: 1.4.1 类的概念: 1.4.2 类的基本结构: 1.4.3 对象的概 ...
- Java第五课:动物声音模拟器
public abstract class Animal{abstract void cry();abstract String getAnimalName(); } class Cat extend ...
- 列表怎么有限的初始化为零_《零基础学习Android开发》第五课 类与面向对象编程1-1...
视频:<零基础学习Android开发>第五课 类与面向对象编程1-1 类的定义.成员变量.构造方法.成员方法 一.从数据与逻辑相互关系审视代码 通过前面的课程,我们不断接触Java语言的知 ...
- 第五课 实战go语言改造php仿优酷-RabbitMQ改造项目
第五课 实战go语言改造php仿优酷-RabbitMQ改造项目 tags: Beego 慕课网 categories: RabbitMQ 五种工作模式 文章目录 第五课 实战go语言改造php仿优酷- ...
- 第五课 工厂方法模式
第五课 工厂方法模式 这个模式用法通过例子很容易学会,但是我一直没能体会到他存在的意义,他能提供的好处.所以在群里讨论了下,也没有搞明白.最终,无意中在Java编程思想中看到了一个工厂方法的应用,突然 ...
- Java进阶之设计模式正则表达式
Java进阶之设计模式&正则表达式 一.设计模式 1.1 设计模式概述 1.2 单例模式 1.2.1 单例模式衍生--多例模式 1.2.2 单例模式衍生--枚举 1.3 工厂模式 二.正则表达 ...
- NeHe OpenGL第三十五课:播放AVI
NeHe OpenGL第三十五课:播放AVI 在OpenGL中播放AVI: 在OpenGL中如何播放AVI呢?利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效果不错. ...
- 【Linux探索之旅】第二部分第五课:用户和权限,有权就任性
内容简单介绍 1.第二部分第五课:用户和权限,有权就任性 2.第二部分第六课预告:Nano,刚開始学习的人的文本编辑器 用户和权限.有权就任性 今天的标题也挺任性的啊,虽说小编是一个非常本分的人(真的 ...
- 第五课.Linux开发基础
第五课目录 GCC用法参考 GCC的常用用法 make与Makefile Makefile的规则 Makefile的语法 Makefile实例 调试 GDB 设置断点 虽然已经有很多优秀的IDE可以化 ...
最新文章
- Analysis Services基础知识——深入SQL Server 2008
- Weblogic IIOP反序列化漏洞(CVE-2020-2551) 漏洞分析
- nvidia控制面板点了没反应win7_为什么没有nvidia控制面板_win7没有nvidia控制面板怎么找回-系统城...
- 29/07/2010 sunrise
- 关于flex布局学习分享
- 剑指offer面试题17. 打印从1到最大的n位数
- 七日Python之路--第八天(一些琐碎)
- 浮动QQ在线客服网站QQ在线咨询
- endnote参考文献排版_基于国家标准的 EndNote 输出样式模板
- 内存监控设置及数据获取方案
- 最小项标准式和卡诺图化简
- Cortex m0+笔记
- 【Unity项目优化宝典】Unity3D手游开发客户端开发经验总结
- 京东商家下单未付款?订单催付教程
- 各个认证记录及说明SRRC与CTA认证
- 啊哈添柴挑战Java1008. 输入两个整数,倒序输出
- 力扣772 基本计算器 III
- 信息平台课件服务器,《CDN平台介绍v》PPT课件.ppt
- 关于socket数据长度
- 快速搞明白公网和私网的区别(组建私网的网络号)
热门文章
- 推荐国内外,安全好用的电子邮箱
- 【渝粤教育】电大中专中药学基础作业 题库
- Red Giant Universe 3中文版
- 使用u盘如何装linux系统教程视频教程,使用U盘安装Linux系统图解一
- Javascript使用三大家族和事件来DIY动画效果相关笔记(六)
- Completed shut down of DiscoveryClient
- 跨站脚本攻击(XSS)及防范措施
- java菜鸟mysql_十面阿里,菜鸟,天猫,蚂蚁金服面试精选73题:Java+Spring+MySQL+JVM.......
- 10015---MySQL--innodb_flush_log_at_trx_commit参数
- 2015美团校招部分笔试题