目录

  • 序言
  • 一、正则标记
  • 二、正则表达式基础知识
    • 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第五课:正则表达式相关推荐

  1. Java第五课. 类对象

    Java第五课. 类&对象 回顾 1. 冒泡:概念,实现:2个for循环分别起的作用 2. 二维数组可以理解成表格:有行有列,行当成一维数组,列当成一维数组中的元素,行有下标(几个一维数组), ...

  2. Java第五课:类和对象

    Java第五课:类和对象 Java第五课:类和对象 1.1 上周回顾 1.2 作业讲解 1.3 类和对象: 1.4 面向对象: 1.4.1 类的概念: 1.4.2 类的基本结构: 1.4.3 对象的概 ...

  3. Java第五课:动物声音模拟器

    public abstract class Animal{abstract void cry();abstract String getAnimalName(); } class Cat extend ...

  4. 列表怎么有限的初始化为零_《零基础学习Android开发》第五课 类与面向对象编程1-1...

    视频:<零基础学习Android开发>第五课 类与面向对象编程1-1 类的定义.成员变量.构造方法.成员方法 一.从数据与逻辑相互关系审视代码 通过前面的课程,我们不断接触Java语言的知 ...

  5. 第五课 实战go语言改造php仿优酷-RabbitMQ改造项目

    第五课 实战go语言改造php仿优酷-RabbitMQ改造项目 tags: Beego 慕课网 categories: RabbitMQ 五种工作模式 文章目录 第五课 实战go语言改造php仿优酷- ...

  6. 第五课 工厂方法模式

    第五课 工厂方法模式 这个模式用法通过例子很容易学会,但是我一直没能体会到他存在的意义,他能提供的好处.所以在群里讨论了下,也没有搞明白.最终,无意中在Java编程思想中看到了一个工厂方法的应用,突然 ...

  7. Java进阶之设计模式正则表达式

    Java进阶之设计模式&正则表达式 一.设计模式 1.1 设计模式概述 1.2 单例模式 1.2.1 单例模式衍生--多例模式 1.2.2 单例模式衍生--枚举 1.3 工厂模式 二.正则表达 ...

  8. NeHe OpenGL第三十五课:播放AVI

    NeHe OpenGL第三十五课:播放AVI 在OpenGL中播放AVI: 在OpenGL中如何播放AVI呢?利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效果不错. ...

  9. 【Linux探索之旅】第二部分第五课:用户和权限,有权就任性

    内容简单介绍 1.第二部分第五课:用户和权限,有权就任性 2.第二部分第六课预告:Nano,刚開始学习的人的文本编辑器 用户和权限.有权就任性 今天的标题也挺任性的啊,虽说小编是一个非常本分的人(真的 ...

  10. 第五课.Linux开发基础

    第五课目录 GCC用法参考 GCC的常用用法 make与Makefile Makefile的规则 Makefile的语法 Makefile实例 调试 GDB 设置断点 虽然已经有很多优秀的IDE可以化 ...

最新文章

  1. Analysis Services基础知识——深入SQL Server 2008
  2. Weblogic IIOP反序列化漏洞(CVE-2020-2551) 漏洞分析
  3. nvidia控制面板点了没反应win7_为什么没有nvidia控制面板_win7没有nvidia控制面板怎么找回-系统城...
  4. 29/07/2010 sunrise
  5. 关于flex布局学习分享
  6. 剑指offer面试题17. 打印从1到最大的n位数
  7. 七日Python之路--第八天(一些琐碎)
  8. 浮动QQ在线客服网站QQ在线咨询
  9. endnote参考文献排版_基于国家标准的 EndNote 输出样式模板
  10. 内存监控设置及数据获取方案
  11. 最小项标准式和卡诺图化简
  12. Cortex m0+笔记
  13. 【Unity项目优化宝典】Unity3D手游开发客户端开发经验总结
  14. 京东商家下单未付款?订单催付教程
  15. 各个认证记录及说明SRRC与CTA认证
  16. 啊哈添柴挑战Java1008. 输入两个整数,倒序输出
  17. 力扣772 基本计算器 III
  18. 信息平台课件服务器,《CDN平台介绍v》PPT课件.ppt
  19. 关于socket数据长度
  20. 快速搞明白公网和私网的区别(组建私网的网络号)

热门文章

  1. 推荐国内外,安全好用的电子邮箱
  2. 【渝粤教育】电大中专中药学基础作业 题库
  3. Red Giant Universe 3中文版
  4. 使用u盘如何装linux系统教程视频教程,使用U盘安装Linux系统图解一
  5. Javascript使用三大家族和事件来DIY动画效果相关笔记(六)
  6. Completed shut down of DiscoveryClient
  7. 跨站脚本攻击(XSS)及防范措施
  8. java菜鸟mysql_十面阿里,菜鸟,天猫,蚂蚁金服面试精选73题:Java+Spring+MySQL+JVM.......
  9. 10015---MySQL--innodb_flush_log_at_trx_commit参数
  10. 2015美团校招部分笔试题