当前位置: 首页 > news >正文

Java学习day_14之API(正则表达式)

   Java正则表达式是一种用于匹配、查找或操作字符串的强大工具,基于java.util.regex包实现。其核心类包括Pattern(编译正则表达式)和Matcher(执行匹配操作)。

一、检验字符串是否满足规则

字符类(只匹配一个字符)

[abc]只能是abc
[^abc]除abc之外的任何字符
[a-zA-Z]a到z A到Z
[a-dm-p]a到d,或m到p
[a-z&&[def]]a-z和def的交集
[a-z&&[^bc]]a-z与非bc的交集 [ad-z]
[a-z&&[^m-p]]a-z和除了m到p的交集 [a-lq-z]
public class RegexDemo2 {public static void main(String[] args) {//只匹配一个字符//[abc]System.out.println("----------1-----------");System.out.println("a".matches("[abc]"));//trueSystem.out.println("z".matches("[abc]"));//falseSystem.out.println("ab".matches("[abc]"));//false//[^abc]System.out.println("----------2-----------");System.out.println("a".matches("[^abc]"));//falseSystem.out.println("d".matches("[^abc]"));//trueSystem.out.println("de".matches("[^abc]"));//falseSystem.out.println("de".matches("[^abc][^abc]"));//true//a到z A到ZSystem.out.println("----------3-----------");System.out.println("A".matches("[a-zA-Z]"));//trueSystem.out.println("a".matches("[a-zA-Z]"));//trueSystem.out.println("0".matches("[a-zA-Z]"));//falseSystem.out.println("zz".matches("[a-zA-Z][a-zA-Z]"));//true//a到d,或m到pSystem.out.println("----------4-----------");System.out.println("a".matches("[a-dm-p]"));//trueSystem.out.println("d".matches("[a-dm-p]"));//trueSystem.out.println("m".matches("[a-dm-p]"));//trueSystem.out.println("p".matches("[a-dm-p]"));//trueSystem.out.println("e".matches("[a-dm-p]"));//false//a-z和def的交集 [a-z&&[def]]System.out.println("----------5-----------");System.out.println("a".matches("[a-z&&[def]]"));//falseSystem.out.println("d".matches("[a-z&&[def]]"));//trueSystem.out.println("z".matches("[a-z&&[def]]"));//false//a-z与非bc的交集 [a-z&&[^bc]]== [ad-z]System.out.println("----------6-----------");System.out.println("a".matches("[a-z&&[^bc]]"));//trueSystem.out.println("b".matches("[a-z&&[^bc]]"));//falseSystem.out.println("z".matches("[a-z&&[^bc]]"));//true//a-z和除了m到p的交集[a-z&&[^m-p]] == [a-lq-z]System.out.println("----------7-----------");System.out.println("a".matches("[a-z&&[^m-p]]"));//trueSystem.out.println("l".matches("[a-z&&[^m-p]]"));//trueSystem.out.println("m".matches("[a-z&&[^m-p]]"));//falseSystem.out.println("q".matches("[a-z&&[^m-p]]"));//true}
}

预定义字符(只匹配一个字符)

.任何字符
\d一个数字:[0-9]
\D非数字 :[^0-9
\s一个空白字符:[\t\n\x0B\f\r]
\S非空白字符:[^\s]
\w[a-zA-Z_0-9] 英文、数字、下划线
\W[^\w]一个非单词字符

数量词

X?X,一次或0次
X*X,0次或多次
X+X,一次或多次
X{n}X,正好n次
X{n,}X,至少n次
X{n,m}X,至少n但不超过m次
public class RegexDemo3 {public static void main(String[] args) {// .表示任意一个字符System.out.println("--------------1-------------");System.out.println("你".matches(".."));//falseSystem.out.println("你".matches("."));//true// \\d只能是任意一个数字System.out.println("--------------2-------------");System.out.println("a".matches("\\d"));//falseSystem.out.println("3".matches("\\d"));//trueSystem.out.println("aa".matches("\\d"));//false// \\w只能是一位单词字符 [a-zA-Z_0-9]System.out.println("--------------3-------------");System.out.println("z".matches("\\w"));//trueSystem.out.println("2".matches("\\w"));//trueSystem.out.println("_".matches("\\w"));//trueSystem.out.println("你".matches("\\w"));//false// 非单词字符System.out.println("--------------4-------------");System.out.println("你".matches("\\W"));//true//多个字符//必须是数字 字母 下划线 至少6位System.out.println("2442_fsfsfs".matches("\\w{6,}"));//trueSystem.out.println("2442".matches("\\w{6,}"));//false//必须是数字和字符 必须4位System.out.println("23df".matches("[a-zA-Z0-9]{4}"));//trueSystem.out.println("23_f".matches("[a-zA-Z0-9]{4}"));//falseSystem.out.println("23dF".matches("[\\w&&[^_]]{4}"));//trueSystem.out.println("23_f".matches("[\\w&&[^_]]{4}"));//false}
}

注:

符号含义
[]里面的内容出现一次
()分组
^取反
&&交集
I并集,写在方括号外

二、在一段文本中查找满足要求的内容

实现思路

  • 定义目标文本:包含多个 Java 版本信息的字符串
  • 创建正则表达式规则
  • 获取正则表达式对象(Pattern):通过编译正则表达式得到
  • 获取文本匹配器对象(Matcher):关联正则表达式和目标文本
  • 循环查找匹配内容:
    使用find()方法从文本中查找下一个符合规则的子串
    使用group()方法获取当前找到的匹配内容
    打印输出所有找到的匹配结果
public class RegexDemo1 {public static void main(String[] args) {/*有如下文本,请按照要求爬取数据Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不就Java17也会逐渐登上历史舞台。要求:找出里面所以的JavaXX*/String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +" 因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不就Java17也会逐渐登上历史舞台。";//Pattern:表示正则表达式//Matcher:文本匹配器,作用按照正则表达式的规则去读取字符串,从头开始读取   从大串中去找符合匹配规则的子串//1.获取正则表达式对象Pattern p = Pattern.compile("Java\\d{0,2}");//2.获取文本匹配器对象//拿着m去读取str,找符合p规则的子串Matcher m = p.matcher(str);//3.利用循环获取while (m.find()){String s = m.group();System.out.println(s);}}
}

在这里插入图片描述

三、有条件爬取、贪婪爬取、非贪婪爬取

有条件爬取

public class RegexDemo1 {public static void main(String[] args) {//有条件爬取/*需求1:爬取版本号为8,11,17的Java文本,但是只要Java,不显示版本号需求2:爬取版本号为8,11,17的Java文本,正确爬取结果为:Java8,Java11,Java17,Java17需求3:爬取除了版本号为8,11,17的Java文本*/String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +" 因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不就Java17也会逐渐登上历史舞台。";//1.定义正则表达式/*? 理解为前面的数据Java= 表示在Java后面要跟随的数据但是在获取的时候只获取前半部分*///需求1String regex1 = "Java(?=8|11|17)";//需求2String regex2 = "Java(?:8|11|17)";String regex3 = "Java(8|11|17)";//需求3String regex4 = "Java(?!8|11|17)";Pattern p = Pattern.compile(regex1);Matcher m = p.matcher(str);while (m.find()){System.out.println(m.group());}}
}

贪婪、非贪婪爬取

public class RegexDemo2 {public static void main(String[] args) {//贪婪和非贪婪爬取//+ * 为贪婪爬取 ,Java默认//非贪婪爬取 +? *?String str = "abbbbbbbbbbbbbbbbbbbbadad";String regex = "ab+";//abbbbbbbbbbbbbbbbbbbbString regex1 = "ab+?";//abPattern p = Pattern.compile(regex1);Matcher m = p.matcher(str);while (m.find()){System.out.println(m.group());}}
}

四、方法补充

方法名说明
public String[] matches(String regex)判断字符串是否满足正则表达式的规则
public String replaceAll(String regex,String newStr)按照正则表达式的规则进行替换
public String[] split(String regex)按照正则表达式的规则切割字符串
public class RegexDemo3 {public static void main(String[] args) {/*有一段字符串:小诗诗asdakdaskldasda小丹丹djaskdasd小慧慧要求1:把字符串中三个姓名之间的字母替换为vs要求2:把字符串中的三个姓名切割出来*/String str = "小诗诗asdakdasklda1sda2小丹丹djaskd23asd小慧慧";String regex1 = "[\\w&&[^_]]+";String newStr = str.replaceAll(regex1,"vs");System.out.println(newStr);String[] arr = str.split(regex1);for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}

在这里插入图片描述

五、捕获分组与非捕获分组

捕获分组:
后续还要继续使用本组的数据
正则内部使用:\组号
正则外部使用:$组号

public class RegexDemo1 {public static void main(String[] args) {//捕获分组/*需求:将字符串:我要学学编编编编程程程程程程转换为:我要学编程*/String str = "我要学学编编编编程程程程程程";/*学学 --  学编编编编  --  编程程程程程程 -- 程*//*(.) 表示把重复内容的第一个字符看做一组\\1 表示第一个字符再次出现+ 至少一次$1 表示把正则表达式中第一组的内容,再拿出来用*/String result = str.replaceAll("(.)\\1+","$1");System.out.println(result);}
}

在这里插入图片描述

非捕获分组:
分组之后不需要再用本组数据,仅仅是把数据括起来

符号含义
(?: 正则)获取所有
(?= 正则)获取前面部分
(?! 正则)获取不是指定内容的前面部分

在这里插入图片描述

http://www.dtcms.com/a/358682.html

相关文章:

  • 【LeetCode】大厂面试算法真题回忆(121) —— 经典屏保
  • 嵌入式Linux驱动开发:蜂鸣器驱动
  • 图解LLM(AI大模型)的工作原理
  • SRE命令行兵器谱之二:lsof - 解密“端口被占用”与“文件句柄泄漏”的终极侦探
  • 吴恩达机器学习作业九:kmeans聚类
  • php电子签名
  • 2025年09月计算机二级MySQL选择题每日一练——第十二期
  • Rust 登堂 之 Sized和不定长类型 DST(七)
  • LabVIEW 时间字符串处理与显示
  • 继电器的作用、选型和测量-超简单解读
  • 算法题(195):点名
  • 【学Python自动化】 2. Windows Python 解释器使用笔记
  • 【shell】Shell脚本中的if判断条件和文件测试操作符
  • “人工智能+”政策驱动下的技术重构、商业变革与实践路径研究 ——基于国务院《关于深入实施“人工智能+”行动的意见》的深度解读
  • STM32的内存分配与堆栈
  • Redis 测试:过期 key 内存释放情况
  • JVM架构图是怎样的?
  • 算法(④KMP)
  • SpringAI应用开发工程师高阶面试剧本与知识点全解析(含RAG、多租户、流式推理、企业落地场景)
  • Python3 lambda(匿名函数)
  • HBase高效并发锁:IdLock极简内存设计
  • Qt QML注册全局对象并调用其函数和属性
  • 银河麒麟Kylin系统编译安装Qt5.12.12
  • Yolov8损失函数:回顾Yolov8-Loss
  • ​导游|基于SprinBoot+vue的在线预约导游系统
  • DrissionPage 实战:高效爬取网页数据并保存为 CSV 的全流程解析
  • (链表)Leetcode206链表反转+Leetcode6删除链表的倒数第N个结点+虚拟头节点使用
  • Linux 笔记 Day01|课程结构
  • 第三弹、AI、LLM大模型是什么?
  • 深度学习重塑医疗:四大创新应用开启健康新纪元