正则表达式

import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/
public class regexp_01 {public static void main(String[] args) {String s = "由于在开发Oak语言时,尚且不存在运行字节码的硬件平台,所以为了在开发时可以对这种语言进行实验研究,他们就在已有的" +"硬件和软件平台基础上,按照自己所指定的规范,用软件建设了一个运行平台,整个系统除了比C++更加简单之外,没有什么大的区" +"别。1992年的夏天,当Oak语言开发成功后,研究者们向硬件生产商进行演示了Green操作系统、Oak的程序设计语言、类库和其" +"硬件,以说服他们使用Oak语言生产硬件芯片,但是,硬件生产商并未对此产生极大的热情。因为他们认为,在所有人对Oak语言" +"还一无所知的情况下,就生产硬件产品的风险实在太大了,所以Oak语言也就因为缺乏硬件的支持而无法进入市场,从而被搁置了下" +"来。\n" +"1994年6、7月间,在经历了一场历时三天的讨论之后,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于" +"万维网。他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看" +"到的。作为原型,帕特里克·诺顿写了一个小型万维网浏览器WebRunner。";//1.\\d表示一个任意的数字String regStr = "(\\d\\d)(\\d\\d)";//2.创建模式对象[即正则表达式对象]Pattern pattern = Pattern.compile(regStr);//3.创建匹配器//说明:创建匹配器matcher,按照正则表达式的规则Matcher matcher = pattern.matcher(s);//4.开始匹配//matcher.find() 完成的任务//1.根据指定的规则,定位满足规则的子字符串(1998)//2.找到后,将子字符串的开始索引记录到matcher对象的属性int[] groups的groups[0]中,// 把子字符串的结束的索引+1的值记录到groups[1]//3.同时记录oldLast的值为groups[1],即下次执行find时,从oldLast开始匹配//什么是分组,比如(\\d\\d)(\\d\\d),正则表达式中有() 表示分组,第一个()表示第一组,第二个()表示第二组,以此类推//例如找到(19)(98)//则记录第一组()匹配到的字符 groups[2]=0 (第一组中1所在的下标) groups[3]=1+1=2 (第一组中9所在的下标加1)//则记录第二组()匹配到的字符 groups[4]=2 (第二组中9所在的下标) groups[5]=3+1=4 (第二组中8所在的下标加1)//调用时,matcher.group(1)和matcher.group(2)返回第一组和第二组截取的字符串//matcher.group(0)完成的任务//根据groups[0]和groups[1]记录的位置,截取子字符串,即[groups[0],groups[1])//如果正则表达式取出的组大于定义的组,则由于初始化groups为-1,会出现数组越界,建议查看源码while(matcher.find()){System.out.println("找到:"+matcher.group(0));System.out.println("找到第一组内容:"+matcher.group(1));System.out.println("找到第二组内容:"+matcher.group(2));}}
}

一.底层原理

(1).matcher.find() 完成的任务

1.根据指定的规则,定位满足规则的子字符串

2.找到后,将子字符串的开始索引记录到matcher对象的属性int[] groups的groups[0]中,
把子字符串的结束的索引+1的值记录到groups[1]

3.同时记录oldLast的值为groups[1],即下次执行find时,从oldLast开始匹配

(2)matcher.group(0)完成的任务

根据groups[0]和groups[1]记录的位置,截取子字符串,即[groups[0],groups[1])

(3)什么是分组,比如(\d\d)(\d\d),正则表达式中有() 表示分组,第一个()表示第一组,第二个()表示第二组,以此类推

例如找到(19)(98)

则记录第一组()匹配到的字符 groups[2]=0 (第一组中1所在的下标) groups[3]=1+1=2 (第一组中9所在的下标加1)

则记录第二组()匹配到的字符 groups[4]=2 (第二组中9所在的下标) groups[5]=3+1=4 (第二组中8所在的下标加1)

调用时,matcher.group(1)和matcher.group(2)返回第一组和第二组截取的字符串

即:matcher.group(0)表示匹配到的字符串,matcher.group(1)表示匹配到的第一组子字符串,matcher.group(2)表示匹配到的第二组子字符串…依此类推

二.正则表达式语法

(1)转义号\\

在检索特殊字符( .*+()$/?[]^{} )时,需要用到\\,否则报错

在java中,两个\\代表其他语言中一个\

(2)字符匹配符


\\w还可以匹配下划线

如何不指定大小写?


\\s匹配任何空白字符
\\S匹配任何非空白字符

(3)选择匹配符

(4)限定符


Java匹配是贪婪匹配,即尽可能匹配多的
非贪婪匹配,在限定符后面加一个 ?

(5)定位符

\\b边界可能是字符串最后,也可以是空格的字符串子串的后面

(6)分组

演示代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/
public class regexp_04 {public static void main(String[] args) {//非命名捕获
//        String content = "zhrzhr s7789 nn1189n";
//        String regStr = "(\\d\\d)(\\d\\d)";
//
//        Pattern pattern = Pattern.compile(regStr);
//        Matcher matcher = pattern.matcher(content);
//
//        while(matcher.find()){//            System.out.println(matcher.group(0));
//            System.out.println("第一个分组为:"+matcher.group(1));
//            System.out.println("第二个分组为:"+matcher.group(2));
//        }//命名捕获String content = "zhrzhr s7789 nn1189n";String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(content);while(matcher.find()){System.out.println(matcher.group(0));//可以用非命名捕获的内容,也可以通过名字来获取System.out.println("第一个分组为:"+matcher.group("g1"));System.out.println("第二个分组为:"+matcher.group("g2"));}}
}

非捕获分组

举例:

import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/
public class regexp_05 {public static void main(String[] args) {//找吃火锅 吃麻辣烫 吃烧烤中的子串 (?:... )String content = "吃火锅 吃麻辣烫 吃烧烤";String regStr = "吃(?:火锅|麻辣烫|烧烤)";//        Pattern pattern = Pattern.compile(regStr);
//        Matcher matcher = pattern.matcher(content);
//
//        while(matcher.find()){//            System.out.println(matcher.group(0));
//        }//找吃火锅 吃麻辣烫中的吃 (?= ...)
//        regStr = "吃(?=火锅|麻辣烫)";
//        Pattern pattern = Pattern.compile(regStr);
//        Matcher matcher = pattern.matcher(content);
//
//        while(matcher.find()){//            System.out.println(matcher.group(0));
//        }//找吃这个关键字,但是找不是吃火锅中的吃 (?!... )regStr = "吃(?!火锅)";Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(content);while(matcher.find()){System.out.println(matcher.group(0));}}
}

三.正则表达式常用类

1.Pattern.matcher(regStr,content)是整体验证,常用方法,返回Boolean值

2.Pattern常用方法

注意:end()是最后元素的下标加1

3.Matcher常用方法

注意:replaceAll("…")返回的才是替换后的字符串,原字符串不变

四.反向引用


举例

import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/
public class regexp_09 {public static void main(String[] args) {//判断是否是4位回文数字
//        String content = "1221";
//        String regStr = "(\\d)(\\d)\\2\\1";
//
//        Pattern pattern = Pattern.compile(regStr);
//        Matcher matcher = pattern.matcher(content);
//
//        if(matcher.find()){//            System.out.println(matcher.group(0));
//        }String content = "12321-333999111";String regStr = "\\d{5}-(\\d)\\1\\1(\\d)\\2\\2(\\d)\\3\\3";Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(content);if(matcher.find()){System.out.println(matcher.group(0));}}
}

我…我要…学学学习习Java 变为 我要学习Java

import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/
public class exercise_03 {public static void main(String[] args) {String str = "我...我要...学学学习习Java";//先去除.str = Pattern.compile("\\.").matcher(str).replaceAll("");//再去除重复的字str = Pattern.compile("(.)\\1+").matcher(str).replaceAll("$1");System.out.println(str);}
}

验证电子邮件是否合法

import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/
public class exercise_04 {public static void main(String[] args) {//验证电子邮件是否合法String content = "1184524381@qq.org.com";String regStr = "^\\w+@([a-zA-Z]+\\.)+[a-zA-Z]+$";//这里使用String的match方法,整体匹配正则表达式if(content.matches(regStr)){System.out.println("匹配成功");}else{System.out.println("匹配失败");}}
}

Java 正则表达式相关推荐

  1. java正则表达式课程_通过此免费课程学习正则表达式

    java正则表达式课程 by Beau Carnes 通过博卡恩斯 通过此免费课程学习正则表达式 (Learn Regular Expressions with this free course) & ...

  2. java正则表达式 1,Java正则表达式学习(1)

    Java正则表达式学习(一) 1.什么是正则表达式: 正则表达式(regular expressions) 是一种描述字符串集的方法,它是以字符串集中各种字符串的公有特征为依据的. 正则表达式可以用于 ...

  3. 孪生素数 java代码_科学网—孪生素数猜想——利用 Java + 正则表达式 输出孪生素数对 - 马廷灿的博文...

    查了一下资料,发现正则表达式竟然可以用来检查素数(http://coolshell.cn/articles/2704.html)!(由于工作需要,几年前开始接触.利用正则表达式,给工作带了很大方便,也 ...

  4. java正则表达式的用法_Java 正则表达式的使用

    Java 正则表达式的使用 1:正则表达式语法大全 字符 说明 \ 将下一字符标记为特殊字符.文本.反向引用或八进制转义符.例如,"n"匹配字符"n".&quo ...

  5. Java正则表达式--Matcher.group函数的用法

    https://www.cnblogs.com/jiafuwei/p/6080984.html Java正则表达式--Matcher.group函数的用法 原来,group是针对()来说的,group ...

  6. java 正则表达式入门(一)

    Java正则表达式 定义:具有特定规则的一种表达式语言. 作用:专门用于操作字符串,操作意味着(校验,截取).且可以简化我们对字符串的操作方式 比如,验证手机号码 如果没有正则表达式我们的过程就应该是 ...

  7. bigint对应java什么类型_「JAVA」从格式化输出到扫描输入,深究Java正则表达式匹配之道

    字符串是不可变的 字符串是不可变的,也就是说当字符串的内容发生改变的时候,会创建一个新的String对象:但是如果内容没有发生改变的时候,String类的方法会返回原字符串对象的引用. 而正则表达式往 ...

  8. Java 正则表达式使用详解

    今天研究开源项目,哆啦A梦,研究里面显示log 的原理. 后来发现,用到了正则表达式.觉得很有用,就捡起来,重新研究一下. 学习思路指导: 每一门学问,最好的深入学习方法,是去其官网,研究其说明文档. ...

  9. java正则表达式 过滤特殊字符的正则表达式

    在网上找了好久也没找到个合适的正则表达式以过滤特殊字符:自己学习了下,写了两个,实现要求. Java代码 // 过滤特殊字符 public static String StringFilter(Str ...

  10. JAVA正则表达式:Pattern类与Matcher类详解(转)

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表 ...

最新文章

  1. UVA 11752 超级幂
  2. 国外论坛BCH关注度暴涨
  3. C语言 | 基于STM32的MPU6050模块程序(主程序)
  4. 信号与系统matlab课设报告,MATLAB信号与系统实验报告
  5. 自学C语言能到达怎样的高度?
  6. 火柴Open Day,你永远不知道你错过了什么!!
  7. nginx中给目录增加密码保护实现程序
  8. python之Beautiflusoup操作
  9. 电脑连接的手机真机,利用Chrome调试WebView
  10. php ziparchive类,PHP Zip ZipArchive 类_编程学问网
  11. SPSS基础教程:认识SPSS的主要窗口
  12. 2020年最新世界地图_2020年标准地图发布,为何要发布新版标准地图?
  13. 这款优秀的检验工具SolidWorks Inspection你用过吗?
  14. CAN协议学习(一)
  15. 超人视觉助我成功转型机器视觉行业
  16. 阿里云服务器ECS由什么组成
  17. 有些市场上卖的卤牛肉40元一斤,是真牛肉吗?
  18. python以图搜图api_Python深度学习,手把手教你实现「以图搜图」
  19. 5分钟带你啃完营销著作《市场营销原理(科特勒)》,思维导图精华版
  20. sql server 三角函数

热门文章

  1. 九宫格锁屏和设置密码(九点密码盘)
  2. html增值税申报表,关于调整增值税纳税申报有关事项的公告
  3. PLC数据采集之协议转换桥接器
  4. 真的神了~无意中发现1500道的2021LeetCode算法刷题pdf笔记
  5. cad特性匹配快捷键命令_cad快捷键命令大全
  6. 基于MATLAB的DS证据融合代码
  7. nodejs EADDRINUSE API拒绝访问
  8. NFT,一种新型社交网络
  9. 安全防御——防病毒网关
  10. 骑士进化论RPG游戏实现