学习java时候的笔记(十九)

正则表达式

作用:

  • 校验字符串是否满足规则
  • 在一段文本中查找满足要求的内容

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

说明
[abc]只能是a,b或c
[^abc]除了a,b,c之外的任何字符
[a-zA-Z]a 到 z, A 到 Z(范围)
[a-d[m-p]]a 到 d, 或 m 到 p
[a - z && [def]]a 到 z和def的交集。为: d, e, f
[a - z && [^bc]]a 到 z和非bc的交际 ( 等同于[ad-z] )
[a-z&&[^m-p]]a 到 z和除了m到p的交集

Demo:

public class RegexDemo1 {public static void main(String[] args) {System.out.println("-------------1----------------");String str1 = "a";System.out.println(str1.matches("[abc]"));//trueSystem.out.println(str1.matches("[a-c]"));//trueSystem.out.println(str1.matches("[^a-c]"));//trueSystem.out.println("ab".matches("[a-c]"));//false 原因: [a-c]只能匹配一个,有两个字符要去匹配两次System.out.println("ab".matches("[a-c][a-c]"));//trueSystem.out.println("-------------2----------------");System.out.println("n".matches("[a-d[m-p]]"));//trueSystem.out.println("nn".matches("[a-d[m-p]]"));//falseSystem.out.println("nn".matches("[a-d[m-p]][a-d[m-p]]"));//trueSystem.out.println("-------------3----------------");//如果要表示两个范围的交集, 要用 &&//如果只写一个 & ,则仅仅是表示一个字符 &System.out.println("a".matches("[a-z&&[def]]"));//falseSystem.out.println("d".matches("[a-z&&[def]]"));//trueSystem.out.println("a".matches("[a-z&[def]]"));//trueSystem.out.println("-------------4----------------");System.out.println("a".matches("[a-z&&[^def]]"));//trueSystem.out.println("d".matches("[a-z&&[^def]]"));//false}
}

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

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

Demo:

public class RegexDemo2 {public static void main(String[] args) {System.out.println("-------------1----------------");//.表示一个任意字符System.out.println("你".matches("."));//trueSystem.out.println("你n".matches("."));//falseSystem.out.println("你n".matches(".."));//trueSystem.out.println("-------------2----------------");//  \d表示一个数字System.out.println("9".matches("\\d"));//trueSystem.out.println("a".matches("\\d"));//falseSystem.out.println("99".matches("\\d"));//falseSystem.out.println("99".matches("\\d\\d"));//trueSystem.out.println("-------------3----------------");// \D 表示非数字System.out.println("9".matches("\\D"));//falseSystem.out.println("a".matches("\\D"));//trueSystem.out.println("ab".matches("\\D"));//falseSystem.out.println("ab".matches("\\D\\D"));//trueSystem.out.println("-------------3----------------");// \s一个空白字符System.out.println("\t".matches("\\s"));//trueSystem.out.println("\t\t".matches("\\s"));//falseSystem.out.println(" ".matches("\\s"));//trueSystem.out.println("  ".matches("\\s"));//falseSystem.out.println("9".matches("\\s"));//falseSystem.out.println("a".matches("\\s"));//falseSystem.out.println("-------------4----------------");// \S非空白字符System.out.println("\t".matches("\\S"));//falseSystem.out.println(" ".matches("\\S"));//falseSystem.out.println("a".matches("\\S"));//trueSystem.out.println("9".matches("\\S"));//trueSystem.out.println("-------------5----------------");// \w [a-zA-Z_0-9]英文、数字、下划线System.out.println("a".matches("\\w"));//trueSystem.out.println("A".matches("\\w"));//trueSystem.out.println("0".matches("\\w"));//trueSystem.out.println("_".matches("\\w"));//trueSystem.out.println("-------------5----------------");// \W 一个非单词字符System.out.println("&".matches("\\W")); //trueSystem.out.println("a".matches("\\W")); //falseSystem.out.println("A".matches("\\W")); //falseSystem.out.println("0".matches("\\W")); //falseSystem.out.println("_".matches("\\W")); //false}
}

数量词(表中的 ‘X’ 代表任意内容)

表达式说明
X?X,一次或0次
X*X,零次或多次
X+X,一次或多次
X{n}X,正好n次
X{n, }X,至少n次
X{n, m}X,至少n次但不超过m次

Demo:

public class RegexDemo3 {public static void main(String[] args) {System.out.println("a".matches("[abc]?"));//true  一次或0次System.out.println("".matches("[abc]?"));//trueSystem.out.println("aaa".matches("[abc]*"));//true  零次或多次System.out.println("".matches("[abc]*"));//trueSystem.out.println("".matches("[abc]+"));//false  一次或多次System.out.println("a".matches("[abc]+"));//trueSystem.out.println("aa".matches("[abc]+"));//trueSystem.out.println("aaa".matches("[abc]{3}"));//true  刚好三次System.out.println("aaaa".matches("[abc]{3}"));//falseSystem.out.println("aa".matches("[abc]{3}"));//falseSystem.out.println("aa".matches("[abc]{3,}"));//false  至少三次System.out.println("aaa".matches("[abc]{3,}"));//trueSystem.out.println("aaaa".matches("[abc]{3,}"));//trueSystem.out.println("aaa".matches("[abc]{3,4}"));//true//至少三次但不超过四次System.out.println("aaaa".matches("[abc]{3,4}"));//trueSystem.out.println("aa".matches("[abc]{3,4}"));//falseSystem.out.println("aaaaa".matches("[abc]{3,4}"));//false}
}

爬虫

正则表达式的对象:Pattern

文本匹配器对象:Matcher

Pattern常见方法:

(待完善)

Matcher常见方法:

(待完善)

方法名说明
find()拿着文本匹配器从头开始读取, 寻找是否有满足规则的字符串.如果没有,方法返回false,如果有,返回true
m.group()该方法底层会根据find方法记录的索引进行字符串的截取,会把截取的小字符串进行返回

Demo1:

package RegexDemo;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class crawler {public static void main(String[] args) {/*有如下文本,请按照要求爬取数据。Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是ava8和ava11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台要求:找出里面所有的JavaXX*/String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";//        method1(str);//1.获取正则表达式的对象,也就是Pattern的对象Pattern p = Pattern.compile("Java\\d{0,2}");//2.获取文本匹配器的对象Matcher m = p.matcher(str);//3.利用循环while (m.find()){String s = m.group();System.out.println(s);}}private static void method1(String str) {//Pattern: 表示正则表达式//Matcher: 文本匹配器,作用按照正则表达式的规则去读取字符串,从头开始读取。在大串中去找符合匹配规则的子串。//1.获取正则表达式的对象,也就是Pattern的对象Pattern p = Pattern.compile("Java\\d{0,2}");//2.获取文本匹配器的对象//m: 文本匹配器的对象//str: 大的字符串//p: 规则//m要在str中找符号p规则的小的字符串Matcher m = p.matcher(str);//拿着文本匹配器从头开始读取, 寻找是否有满足规则的字符串//如果没有,方法返回false//如果有,返回true,在底层记录子串的起始索引和结束索引+1boolean b = m.find();//该方法底层会根据find方法记录的索引进行字符串的截取//会把截取的小字符串进行返回String s1 = m.group();System.out.println(s1);}
}

Demo2:

package RegexDemo;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class crawlerTwo {public static void main(String[] args) {String s = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是java8和Java11," +"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";//定义正则表达式//? 理解为前面的数据Java//= 表示后面要跟随的数据//但是在获取的时候只获取前半部分// (?i) : 忽略大小写String regex1 = "((?i)Java)(?=8|11|17)";//下面两个效果相同//使用 " : " 时获取数据的时候获取全部String regex2 = "((?i)Java)(8|11|17)";String regex3 = "((?i)Java)(?:8|11|17)";//去掉Java后面后 8/11/17 的数据String regex4 = "((?i)Java)(?!8|11|17)";Pattern p = Pattern.compile(regex1);Matcher m = p.matcher(s);while (m.find()) {System.out.print(m.group() + " ");}System.out.println();Pattern p1 = Pattern.compile(regex2);Matcher m1 = p1.matcher(s);while (m1.find()) {System.out.print(m1.group() + " ");}System.out.println();Pattern p2 = Pattern.compile(regex3);Matcher m3 = p2.matcher(s);while (m3.find()) {System.out.print(m3.group() + " ");}System.out.println();Pattern p3 = Pattern.compile(regex4);Matcher m4 = p3.matcher(s);while (m4.find()) {System.out.print(m4.group() + " ");}}
}

Demo3:

package RegexDemo;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class crawlerThree {public static void main(String[] args) {/*需求1∶按照ab+的方式爬取ab,b尽可能多获取需求2:按照ab+的方式爬取ab,b尽可能少获取*/String s ="Java自从95年问世以来,abbbbbbbbbbbbaaaaaaaaaaaaaaaaaa" +"经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";//贪婪爬取  (Java默认)String regex = "ab+";Pattern p = Pattern.compile(regex);Matcher m = p.matcher(s);while (m.find()){System.out.println(m.group());}//非贪婪爬取  (在 " + " 后面加一个问号就行了)String regex1 = "ab+?";Pattern p2 = Pattern.compile(regex1);Matcher m2 = p2.matcher(s);while (m2.find()){System.out.println(m2.group());}}
}

正则表达式在字符串方法中的使用:

方法名说明
matches(String regex)判断字符串是否满足正则表达式规则
replaceAll(String regex, String newstr)按照正则表达式规则进行替换
split(String regex)按照正则表达式的规则切割字符串

Demo4:

package RegexDemo;public class crawlerFour {public static void main(String[] args) {/*有一段字符串:小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠要求1:把字符串中三个姓名之间的字母替换为vs要求2:把字符串中的三个姓名切割出来*/String s = "小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠";String result1 = s.replaceAll("[\\w && [^_]]+", "vs");System.out.println(result1);String[] s1 = s.split("[\\w &&[^_]]+");for (int i = 0; i < s1.length; i++) {System.out.println(s1[i]);}}
}

最后:欢迎大家关注我的公众号
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【树莓派学习】系统烧录及VNC连接、文件传输

【树莓派学习】系统烧录及VNC连接、文件传输 Raspberry Pi is a series of small single-board computers (SBCs) developed in the United Kingdom by the Raspberry Pi Foundation in association with Broadcom. Since 2013, Raspberry Pi devices have been developed and…

Ubuntu20.4版本安装ROS教程

一、配置源 安装成功的Ubuntu系统自带的工具下载速度慢&#xff0c;不太好用&#xff0c;所以我们可以使用国内稳定高速且免费的镜像网站。 清华源&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云&#xff1a;https://mirrors.aliyun.com/pypi/simple 中科大&…

Comparable 和 Comparator

文章目录 一.Comparable二. Comparator三.对比1. Comparable 接口2. Comparator 接口总结 一.Comparable 源码&#xff1a; public interface Comparable<T> {int compareTo(T o); }返回值&#xff1a; 如果当前对象小于参数对象&#xff0c;则返回负整数。如果当前对象等…

启动 UE4编辑器报 加载 Plugin 失败

启动 UE4编辑器报 加载 Plugin 失败&#xff0c;报如下错误&#xff1a; Plugin ‘SteamVR’ failer to load because module ‘SteamVR’ could not be found. Please ensure the plugin is properly installed, otherwise consider disabling the plugin for this project. …

TorchEEG文档_学习笔记1【代码详解】

文章目录 一、用户文档1.安装Pytorch2.安装TorchEEG3.安装与图算法的插件 二、教程1.使用TorchEEG完成深度学习工作流程2datasets模块3.transforms模块4.models模块5.trainer模块6.使用Vanilla PyTorch训练模型 一、用户文档 1.安装Pytorch TorchEEG依赖于PyTorch,根据系统、…

MYSQL之增删改查(下)

前言&#xff1a; 以下是MySQL最基本的增删改查语句&#xff0c;很多IT工作者都必须要会的命令&#xff0c;也 是IT行业面试最常考的知识点&#xff0c;由于是入门级基础命令&#xff0c;所有所有操作都建立在单表 上&#xff0c;未涉及多表操作。 4.3 高级查询 4.3.1 聚合函…

2024-简单点-假设我要让一个py功能文件变成服务,在网络启动后进行,并且开机自动启动。

功能&#xff1a;假设我要让一个py功能文件变成服务&#xff0c;在网络启动后进行&#xff0c;并且开机自动启动。 cd /etc/systemd/system/ sudo nano xxxxxx.service[Unit] Descriptionwrite whatever you want Afternetwork.target [Service] Typesimple ExecStart/usr/bi…

Navicat 干货 | 了解 PostgreSQL 规则

PostgreSQL 是一个强大的开源关系型数据库管理系统&#xff0c;为增强数据管理和操作提供了丰富的功能。这些功能中包含了规则&#xff0c;这是一种用于控制数据库内部查询和命令处理方式的机制。本文将探讨 PostgreSQL 规则的工作原理&#xff0c;以及它们与触发器的区别&…

N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,它的功能是:找出学生的最高分,由函数值返回。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析 分别包含C语言、C++、Java、Python四种语言的解法和详细解析。 题干 N名学生的成绩已在主…

实验室三大常用仪器1---示波器的基本使用方法(笔记)

目录 示波器的作用 示波器的基础操作方法 示波器测量突变脉冲 示波器的作用 示波器能帮助我们干什么&#xff1f; 比如说某个电源用万用表测量是稳定的5V输出 但是用示波器一看确实波涛汹涌 这样的电源很可能回导致系统异常工作 又比如电脑和单片机进行串口通信时&#xf…

【C++干货基地】面向对象核心概念 const成员函数 | 初始化列表 | explicit关键字 | 取地址重载

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

sketchup创建3D打印机的模型

查了一下&#xff0c;这玩意有几个版本&#xff0c;其中一个sketchup free是免费的&#xff0c;到官网上看看 下载 SketchUp | 免费试用 3D 建模软件 | SketchUp 是个在线网页版&#xff0c;然后可以再这个网站上注册一个账号 弄个邮箱试试看 创建好进入后&#xff0c;里面就…

js 遍历数据结构,使不符合条件的全部删除

js 遍历数据结构&#xff0c;使不符合条件的全部删除 let newSourceJSON.parse(JSON.stringify(state.treeData))state.expandedKeys[]checkedKeys.map((item:any)>{loop(newSource,{jsonPath:item.split(&)[1]},state.expandedKeys)})function removeUnwantedNodes(tre…

LeetCode-最长递增子序列

每日一题 今天继续来练习动态规划 题目要求 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数…

Java学习笔记:do_while循环

相关介绍&#xff1a; 在Java中&#xff0c;do-while循环是一种基本的控制流语句&#xff0c;它至少执行一次循环体&#xff0c;然后根据条件判断是否继续执行。这种循环结构的特点是先执行循环体&#xff0c;然后判断条件&#xff0c;如果条件为真&#xff0c;则继续执行循环…

广东制造业企业图纸防泄密解决方案,广东图纸加密,深圳图纸加密软件安秉信息

广东省制造业是我国国民经济的重要支柱产业&#xff0c;企业之间的竞争体现在公司的所有层面上&#xff0c;包括产品、技术、人员、管理等。而信息技术的应用更是提高了企业间竞争水平&#xff0c;随着文档电子化、办公自动化、设计数字化、存储集中化的不断普及&#xff0c;信…

SpringCloud系列(7)--Eureka服务端的安装与配置

前言&#xff1a;上一章节我们介绍了Eureka的基础&#xff0c;本章节则介绍Eureka服务端的安装与配置 Eureka架构原理图 1、创建Eureka Server端服务注册中心模块 (1)在父工程下新建模块 (2)选择模块的项目类型为Maven并选择模块要使用的JDK版本 (3)填写子模块的名称&#xf…

如何在Windows安装Ollama大语言模型工具并实现无公网IP异地远程使用

文章目录 前言1. 运行Ollama2. 安装Open WebUI2.1 在Windows系统安装Docker2.2 使用Docker部署Open WebUI 3. 安装内网穿透工具4. 创建固定公网地址 前言 本文主要介绍如何在Windows系统快速部署Ollama开源大语言模型运行工具&#xff0c;并安装Open WebUI结合cpolar内网穿透软…

线程池的创建方式

线程池的创建方式&#xff1a; 1、newCachedThreadPoo&#xff1a; 创建一个可缓存的线程池&#xff0c;当线程池的线程数量超过任务数量时&#xff0c;自动回收空闲线程&#xff0c;当线程当任务数量超过线程池的线程数量时&#xff0c;自动添加新线程; ExecutorService exec…

详解数据在内存中的存储

系列文章目录 第一章 C语言基础知识 第二章 C语言控制语句 第三章 C语言函数详解 第四章 C语言数组详解 第五章 C语言操作符详解 第六章 C语言指针详解 第七章 C语言结构体详解 文章目录 1. 数据类型 1.1 基本数据类型 1.2 派生数据类型 2. 整形在内存中的存储 2.1 …