1.快速入门

1.先大概了解基本规则,不懂无妨:
[ ] 代表可选择项
[a-z ] 可选一个a-z的字母
[ 01]代表可选一个0或1的数字
. 在 [ ] 中就是 . ; 在()中 是 一个任意 非\n换行 的字符 写在外面也是 个任意 非\n换行 的字符。
在确定开头和结尾时 才用 ^ 和 $。 + 在 [ ] 中就是 + ; 在()中 是 1到多 写在外面也是 1到多。 * 在 [ ] 中就是 * ; 在()中 是 0到多 写在外面也是 0到多
2.ok到了这里我们开始入门案例先了解:

public class Project {public static void main(String[] args) {String context="1994年6、7月间,在经历了一场历时三天的讨论之后,团队决定再一次改变了努力的目标,这次他们决" +"定将该技术应用于万维网。他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一" +"远景正是他们在有线电视网中看到的。作为原型,帕特里克·诺顿写了一个小型万维网浏览器WebRunner。 [8] \n" +"1995年,互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的静态网页能够“灵活”起来,急需一种软件技术来" +"开发一种程序,这种程序可以通过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了大量的人力、物" +"力和财力。这个时候,Sun公司想起了那个被搁置起来很久的Oak,并且重新审视了那个用软件编写的试验平台,由于它是" +"按照嵌入式系统硬件平台体系结构进行编写的,所以非常小,特别适用于网络上的传输系统,而Oak也是一种精简的语言," +"程序非常小,适合在网络上传输。Sun公司首先推出了可以嵌入网页并且可以随同网页在网络上传输的Applet(Applet是一种" +"将小程序嵌入到网页中进行执行的技术),并将Oak更名为Java。5月23日,Sun公司在Sun world会议上正式发布Java和Ho" +"tJava浏览器。IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和微软等各大公司都纷纷停止了自己的相关开发项目," +"竞相购买了Java使用许可证,并为自己的产品开发了相应的Java平台。 [9-10]  \n" +"1996年1月,Sun公司发布了Java的第一个开发工具包(JDK 1.0),这是Java发展历程中的重要里程碑,标志着Java成为一" +"种独立的开发工具。9月,约8.3万个网页应用了Java技术来制作。10月,Sun公司发布了Java平台的第一个即时(JIT)编译器。";//首先先获得一个正则表达式的对象
//        Pattern pattern=Pattern.compile("[a-zA-Z]+");  //获取文中所有单词
//        Pattern pattern = Pattern.compile("[0-9]+");    //获取文中所有数字Pattern pattern = Pattern.compile("[0-9]+|[a-zA-Z]+");  //获取文中所有数字加单词//Pattern pattern = Pattern.compile("\\d\\d\\d\\d");    其中一个\\d代表一个0-9的任意数字//创建一个匹配器对象   就是按照一个正则表达式的要求去文本中查找Matcher matcher = pattern.matcher(context);//通过循环查找所有满足条件的字符串while (matcher.find()){   //如果找到,返回true 没有则falseSystem.out.println(matcher.group()); //默认值就是0 可写可不写}}
}

3.理解正则表达式的需求问题

  • 手机号码校验
  • 邮箱验证
    简单来说正则表达式就是对字符串的匹配的技术

2.正则表达式底层实现

public class Project{public static void main(String[] args) {String str = "1998年12月8日,第二代Java平台的企业版J2EE发布。" +"1999年6月,Sun公司发布了第二代Java平台(简称为Java2)" +"的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版)" +",应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard " +"Edition,Java 2平台的标准版),应用于桌面环境;J2EE(" +"Java 2Enterprise Edition,Java 2平台的企业版)," +"应用于基于Java的应用服务器3443。Java 2平台的发布,是Java发展" +"过程中最重要的一个里程碑,标志着Java的应用开始普及9889。";//说明//1. \\d  表示一个任意的数字(0-9)String regStr = "\\d\\d\\d\\d";//2.创建模式对象[即正则表达式对象]Pattern pattern = Pattern.compile(regStr);//3.创建匹配器//说明 :创建匹配器 matcher ,按照正则表达式的规则,去匹配 str字符串Matcher matcher = pattern.matcher(str);//开始匹配/** matcher.find() 完成的任务1. 根据指定的规则,定位满足规则的子字符串(比如1999)2. 找到后,将 子字符串的**开始的索引**记录到 matcher 对象的属性int[] groups;  groups[0]=0(groups[0]的值会改变,每一个符合规则的子字符串开始的索引)把该子字符串的结束的 **索引+1**的索引值 记录到groups[1]* (groups[1]的值会改变,每一个符合规则的子字符串结束的索引+1)=43. 同时记录oldLast 的值为 子字符串的结束的 索引+1 的索引值 ,即4。即下次执行find()方法时,就从35开始匹配***matcher.group(0) 完成的任务public String group(int group) {if (first < 0)throw new IllegalStateException("No match found");if (group < 0 || group > groupCount())throw new IndexOutOfBoundsException("No group " + group);if ((groups[group*2] == -1) || (groups[group*2+1] == -1))return null;return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();}1. 根据groups[0]=0 和 groups[1]=4 的记录的位置,*从content 开始截取子字符串返回的值 就是  [0,4)   左闭右开,*即包含  0  但是不包含   42. 如果再次执行find方法,仍然按照上面分析来执行* */while (matcher.find()){System.out.println(matcher.group(0));}}
}

什么是分组:正则表达式中有 小括号() 就表示分组,比如:(\d\d)(\d\d) ,第一个()就表示第1组,第二个()就表示第2组…以此类推,

那么分组后的底层又是怎么样的呢

public class Project{public static void main(String[] args) {String str = "1998年12月8日,第二代Java平台的企业版J2EE发布。" +"1999年6月,Sun公司发布了第二代Java平台(简称为Java2)" +"的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版)" +",应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard " +"Edition,Java 2平台的标准版),应用于桌面环境;J2EE(" +"Java 2Enterprise Edition,Java 2平台的企业版)," +"应用于基于Java的应用服务器3443。Java 2平台的发布,是Java发展" +"过程中最重要的一个里程碑,标志着Java的应用开始普及9889。";//说明//1. \\d  表示一个任意的数字(0-9)String regStr = "(\\d\\d)(\\d\\d)";//2.创建模式对象[即正则表达式对象]Pattern pattern = Pattern.compile(regStr);//3.创建匹配器//说明 :创建匹配器 matcher ,按照正则表达式的规则,去匹配 str字符串Matcher matcher = pattern.matcher(str);//开始匹配/** matcher.find() 完成的任务1. 根据指定的规则,定位满足规则的子字符串(比如1999)2. 找到后,将 子字符串的**开始的索引**记录到 matcher 对象的属性int[] groups;  groups[0]=0(groups[0]的值会改变,每一个符合规则的子字符串开始的索引)把该子字符串的结束的 **索引+1**的索引值 记录到groups[1](groups[1]的值会改变,每一个符合规则的子字符串结束的索引+1)=4也就是说:groups[0]和groups[1]的值,还是按照原来的规则赋值但是,由于这里有了分组,需要记录 每个分组后子字符串的值groups[2]:记录第一个分组,子字符串开始的索引值  =0groups[3]:记录第一个分组,子字符串结束的索引+1 的值  =2groups[4]:记录第二个分组,子字符串开始的索引值  =2groups[5]:记录第二个分组,子字符串结束的索引+1 的值  =4...以此类推3. 同时记录oldLast 的值为 子字符串的结束的 索引+1 的索引值 ,即4。即下次执行find()方法时,就从35开始匹配***matcher.group(0) 完成的任务public String group(int group) {if (first < 0)throw new IllegalStateException("No match found");if (group < 0 || group > groupCount())throw new IndexOutOfBoundsException("No group " + group);if ((groups[group*2] == -1) || (groups[group*2+1] == -1))return null;return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();}1. 根据groups[0]=0 和 groups[1]=4 的记录的位置,*从content 开始截取子字符串返回的值 就是  [0,4)   左闭右开,*即包含  0  但是不包含   42. 如果再次执行find方法,仍然按照上面分析来执行* */while (matcher.find()){//如果正则表达式有(),即分组//取出匹配的规则如下//但是不能 取 没有的分组System.out.println(matcher.group(0));//输入 0 表示输出整个字符串System.out.println("该字符串第一组的值:"+matcher.group(1));//输入 1 表示输出该字符串中的第一组System.out.println("该字符串第二组的值:"+matcher.group(2));//输入 2 表示输出该字符串中的第二组//...以此类推}}
}

3.正则表达式的基本语法

基本介绍

如果想要灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:
限定符
选择匹配符
分组组合和反向引用符
特殊字符
字符匹配符
定位符

3.1 元字符-转义字符

\符号 说明:在我们使用正则表达式取检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错的,案例:用 $ 去匹配 “abc$(” 会怎么样?

用 ( 去匹配 “abc$(” 会怎么样?

提示:在java的正则表达式中,两个\代表其它语言中的\

常见的需要用到转移符号的字符有以下几种:. * + ( ) $ / \ ? [ ] ^ { }

单独一个 . 点 不加转义符,匹配的是所有字符

public class RegExp01 {public static void main(String[] args) {String content = "abc$(abc(123(";//String str = "$";没有匹配到结果//String str = "(";//直接报错//String str = "\\$";String str = "\\(";Pattern pattern = Pattern.compile(str);Matcher matcher = pattern.matcher(content);while (matcher.find()){System.out.println(matcher.group(0));}}
}

3.2 元字符-字符匹配符


java正则表达式默认是区分字母大小写的,如何实现不区分大小写

  • (?i)abc:表示abc都不区分大小写
  • a(?i)bc:表示bc不区分大小写
  • a((?i)b)c:表示只有b不区分大小写
    +Pattern pat = Pattren.compile(regEX,Pattern.CASE_INSENSITIVE);

3.3 元字符-选择匹配符

在匹配某个字符串的时候是选择性的,即:既可以匹配这个,又可以匹配那个,这时你需要用到哦 选择匹配符 |

3.4 元字符-限定符

用于指定前面的字符和组合项连续出现多少次

java匹配默认是贪婪匹配,即尽可能的匹配多的部分,比如:a{3,4} aaaaaa12

会匹配出aaaa,而不是aaa和aaa

3.5 元字符-定位符

定位符,规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置,这个也是相当有用的,必须掌握

3.5 分组

String str = "(?<g1>\\d\\d)(?<g2>\\d\\d)";
sout(matcher.group(1));
sout(matcher.group("g1"));
//命名之后就会两种获取分组后子字符串的方法,没有命名只能通过顺序来获取

特别分组
这种分组,后面就只能通过matcher.group(0)方式来获取到值,不能通过matcher.group(1),matcher.group(2)…等等,因为不是捕获分组

public class RegExp01 {public static void main(String[] args) {String content = "hello韩顺平教育 jack韩顺平老师 韩顺平同学hello";//String regStr = "韩顺平教育|韩顺平老师|韩顺平同学"//String regStr = "韩顺平(?:教育|老师|同学)";//只匹配韩顺平后面是  教育或者老师 的 韩顺平 的字符串//String regStr = "韩顺平(?=教育|老师)";//不匹配韩顺平后面是  教育或者老师 的 韩顺平 的字符串String regStr = "韩顺平(?!教育|老师)";Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(content);while(matcher.find()){System.out.println(matcher.group(0));}}
}

注意:在 限定符(* + ? {n} {n,} {n,m}) 后面加上一个问号(?)表示非贪婪匹配

3.6 应用实例

  • 汉字
  • 邮政编码:要求:是1-9开头的一个六位数,比如:123890
  • QQ号码:要求:是1-9开头的一个(5位数-10位数),比如:12389,1345678
  • 手机号码:要求:必须以13,14,15,18开头的11位数,比如13588889999
  • URL:如:https://www.bilibili.com/video/BV1fh411y7R8?from=search&seid=183160912083761326
public class RegExp01 {public static void main(String[] args) {String content = "韩顺平教育";String content1 = "123455";String content4 = "https://www.bilibili.com/video/BV1fh411y7R8?from=search&seid=183160912083761326";
//汉字//^[Α-¥]+$的意思是,从开头到结尾 这一整段内容,都要符合中间的这个规则 [Α-¥]+//这里的意思是把 韩顺平教育  和  [Α-¥]+ 进行匹配//并且有 ^ 和 $ 的话,指定的长度至少是要和  content 的长度一样,不能小于这个长度String regStr = "^[\u0391-\uffe5]+$";//这里的 ^和$ 指的是 content 的开始和结束,是整个字符串,因为这里有个 + 号
//邮政编码,是1-9开头的一个六位数String regStr1 = "^[1-9]\\d{5}$";
//qq号码,是1-9开头的一个5位数-10位数String regStr2 = "^[1-9]\\d{4,9}$";
//手机号码,13 14 15 18开头的十一位数String regStr3 = "^1[3|4|5|8]\\d{9}$";
//url,需要注意,[]中的符号,代表的是本身String regStr4 = "^([https|http]://)(([\\w-]+\\.)+[\\w])+(\\/[\\w-?=&/%.#]*)?$";Pattern pattern = Pattern.compile(regStr4);Matcher matcher = pattern.matcher(content4);if(matcher.find()){System.out.println("满足格式");System.out.println(matcher.group(0));}else{System.out.println("不满足格式");}}
}

4.正则表达式三个常用的类

java.util.regex包主要包括以下三个类Pattren类,Matcher类和PatternSyntaxException

4.1 Pattern类

Pattren 对象是一个正则表达式对象,Pattren类没有公共构造方法,要创建一个Pattern 对象,调用其公共静态方法,它返回一个Pattern 对象,该方法接收一个正则表达式作为它的一个参数,比如:Pattern r = Pattern.compile(pattern)

  • Pattern类的方法 matches,整体匹配,看content的内容,是否符合regStr的规则,有点类似 ^ $
String content = "hello abc hello 韩顺平教育";
String regStr = "hello";
String regStr = "hello.*";//true
boolean matches = Pattern.matches(regStr,content);
sout("整体匹配="+matches);//false

如果我们只需要匹配内容是否符合规则,而不需要找到匹配的内容,可以这样使用

4.2 Matcher类

Matcher 对象是对输入字符串进行解释和匹配的引擎,与Pattern 类一样,Matcher也没有公共构造方法,你需要调用Pattern对象的matcher方法来获取一个Matcher对对象
方法及说明:

  • public int start():返回以前匹配的初始索引
  • public int start(int group):返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引
  • public int end(int group):返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量
  • public int end():返回最后匹配字符之后的偏移量
  • public boolean find():尝试查找与该模式匹配的输入序列的下一个子序列
  • public boolean find(int start):重置匹配器,然后尝试查找匹配该模式,从指定索引开始的输入序列的下一个子序列
  • public boolean matches():尝试将整个区域与模式匹配
  • public String replaceAll(String replacement):替换模式与给定替换字符串想匹配的输入序列的第一个子序列

4.3 PattrenSyntaxException

PatternSyctaxEcxeption是一个非强制异常类,它表示一个正则表达式模式中的语法错误

分组,捕获,反向引用

给你一段文本,请你找出所有四个数字连在一起的子串,并且这四个数字要满足第一位和低四位相同,第二位和第三位相同,比如:1221,5775…

要解决前面的问题,我们需要了解正则表达式的几个概念:

  • 分组:我们可以用圆括号组成一个比较复杂的匹配模式,那么一个圆括号的部分我们可以看做是一个子表达式/分组
  • 捕获:把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显式命名的组名,方便后面引用,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推,组0表示的是整个正则式
  • 反向引用:圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个我们称为反向引用,这种引用既可以式在正则表达式内部,也可以是在正则表达式外部,内部反向引用\分组号,外部反向引用¥分组号

案例:

  • 要匹配两个连续的相同数字:(\\d)\\1
  • 要匹配五个连续的相同数字:(\\d)\\1{4}
  • 要匹配个位与千位相同,十位与百位相同的数 5225 ,1551 :(\\d)(\\d)\\2\\1;
  • 请在字符串中检索·商品编号,形式如:12321-333999111这样的号码,要求:满足前面是一个五位数,然后一个-号,然后是一个九位数,连续的每三位都相同:\\d{5}-(\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2}
  • 把“我…我要…学学学学…编程java!”,通过正则表达式修改成“我要学编程java”:(.)\\1{2,}
//老韩思路:先把点去掉//String regStr = "\\.+"//再把重复的 . 去掉String content = "我...我要...学学学学...编程java!";//String regStr1 = "(.)\\1{2,}";//我.我要.学.编程java!String regStr = "\\.+";//我.我要.学.编程java!Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(content);while(matcher.find()){content = matcher.replaceAll("");System.out.println(content);}String regStr1 = "(.)\\1+";//我.我要.学.编程java!Pattern pattern1 = Pattern.compile(regStr1);Matcher matcher1 = pattern1.matcher(content);while(matcher1.find()){content = matcher1.replaceAll("$1");System.out.println(content);}

String类中使用正则表达式

  • String 类 public String replaceAll(String regex,String replacement)
String content = "jdk1.3 jdk1.4";
content = content.replaceAll("jdk1\\.3|jdk1\\.4","jdk");
sout(content);
  • 判断功能,String 类 public boolean matches(String regex){}
//要求:验证一个手机号,必须是以138、139开头的
String content = "13564564565";
if(content.matches("1(38|39)\\d{8}")){sout("验证成功");
}else{sout("验证失败");
}
  • 分割功能,String类 public String[](String regex)
String content = "hello#abc-jack12smith~北京";
//要求按照 # - ~ 数字 来分割
String[] split = content.split("#|-|~|\\d+");
//iter,增强for循环输出split数组

正则表达式(韩顺平讲解)相关推荐

  1. 韩顺平主讲PHP从入门到精通掌握网站核心技术

    本视频教程为传智播客讲师韩顺平讲解 视频目录如下: 下载地址:百度网盘 0讲 PHP开山篇 1讲 html介绍 html运行原理① 2讲 html运行原理② html文件基本结构 html元素和属性 ...

  2. 韩顺平老师讲解13个自学编程的坑

    文章目录 前言 内容 误区一 不注重基础,什么技术火就学什么 误区二 总是纠结学最好的编程语言 误区三 喜欢看不喜欢动手 误区四 没有认识到,听懂和能使用时两回事 误区五 很少做笔记,也不去画思维导图 ...

  3. 韩顺平java基础——坦克大战(含有线程、I\O流的讲解)

    写在最前边: 研究生一枚,为后端实习和未来工作打基础.无意间发现韩顺平老师的课程,细心细致,讲课和吴恩达老师一样,都是保姆式讲解,各种基础知识都会补充,爱了. 韩顺平老师课程地址:https://ww ...

  4. 【尚硅谷|韩顺平】数据结构和算法

    文章目录 前言: 数据结构和算法 数据结构和算法的概述 数据结构和和算法的关系 数据结构 线性结构和非线性结构 非线性结构 稀疏 sparsearray 数组 基本介绍: 稀疏数组的处理方法是: 应用 ...

  5. html百度首页制作视频,韩顺平 轻松搞定网页设计 html+css+js

    韩顺平老师的教程影响着一代又一代的学子们,他的视频教程确实做的很经典,不论是java.php还是网页设计,都有出彩的地方.这里,小编给大家分享韩顺平老师的轻松搞定网页设计教程,绝对完整,全部存于百度网 ...

  6. servletjsp入门.....韩顺平笔记

    u 背景知识介绍 J2EE的13种技术 java->servlet->jsp [技术总是有一个演变过程] zip粘贴到word设置 u 回顾一下我们现有的技术 java 基础(面向对象,集 ...

  7. 韩顺平JAVA-D2

    020 转义字符 //转义字符 public class ChangeChar{public static void main(String[] args){ // \t :一个制表位,实现对齐的功能 ...

  8. 韩顺平Oracle笔记

    韩顺平玩转Oracle9i 1. Oracle认证和安装,与其他数据库比较 Oracle安装会自动的生成sys用户和system用户: (1)sys用户是超级用户,具有最高权限,具有sysdba角色, ...

  9. 适合有编程基础的人看的《韩顺平零基础30天学java》笔记(P104~P129)

    写在最前边: 研究生一枚,为后端实习和未来工作打基础.无意间发现韩顺平老师的课程,细心细致,讲课和吴恩达老师一样,都是保姆式讲解,各种基础知识都会补充,爱了. 韩顺平老师课程地址:https://ww ...

最新文章

  1. CodeGen CreateFile实用程序
  2. python中open函数的使用
  3. 华中科大计算机冯丹,华中科大南加校友会欢迎母校代表团
  4. hdu5014 构造b数列使得t最大(小想法)
  5. python数据运算
  6. sql 循环处理数据_图文介绍 SQL 的三种查询计划处理模型,Spark 用了其中两个
  7. mysql binlog查看工具_数据同步工具otter(一)谈谈binlog和canal
  8. 【网络信息安全】鉴别和密钥分配协议
  9. android 暂停音乐播放器,Android仿音乐播放器带进度的播放暂停按钮
  10. FindBugs-IDEA插件的使用
  11. Modelsim SE 的下载安装与注册
  12. node.js 模板引擎
  13. ROS2 C++ Subscriber Publisher 订阅发布例子
  14. 2020 年的风口是什么?
  15. 整理UI设计的三个分类,入门前要清楚!
  16. Micro-cap导入元件库
  17. 热敏打印机 java实现根据打印机名字实现分别打印小票
  18. matlab画出给定点,已知各点之间的距离,怎么用MATLAB画出点
  19. Hadoop1.2.0开发笔记(八)
  20. 300行代码实现 微信或QQ 抢红包功能

热门文章

  1. python回归分析例题_python编程线性回归代码示例
  2. js 判断字符串是否全是数字
  3. IDEA的debug调试功能
  4. 高级JAVA开发必备技能:java8 新日期时间API((一)JSR-310:ZoneId 时区和偏移量)(JAVA 小虚竹)
  5. 一、Python时间序列小波分析——实例分析
  6. Mqtt通信协议详解
  7. python多维字典_python定义多维字典
  8. 长轮询和短轮询的区别
  9. jabber技术概况
  10. system verilog断言学习笔记