Java基础11:正则表达式

news2024/9/22 1:06:20

Java基础11:正则表达式

  • 一、匹配规则
    • 1. 字符类(只匹配一个字符)
    • 2. 预定义字符(只匹配一个字符)
    • 3. 数量词
  • 二、Pattern
  • 三、Matcher
  • 四、在字符串方法中的使用
    • 1. matches
    • 2. replaceAll
    • 3. split
  • 五、 Pattern+Matcher示例
    • 1. 爬取数据
    • 2. 有条件的爬取数据
  • 六、贪婪爬取和非贪婪爬取
    • 1. 贪婪爬取
    • 2. 非贪婪爬取
  • 七、捕获分组和非捕获分组
    • 1. 非捕获分组
    • 2. 内部使用捕获分组
    • 3. 外部使用捕获分组

一、匹配规则

  • |表示或者:[X|x]X或者x
  • (?i)表示忽略大小写:a((?i)b)cac小写,B忽略大小写
  • &&表示两个范围的交集,如果只是一个&代表匹配一个&符号

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

正则表达式说明
[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和非b、c的交集,等同于[ad-z]
[a-z&&[^m-p]]a-z和除了m-p的交集,等同于[a-lq-z]

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

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

3. 数量词

正则表达式说明
X?X出现一次或0次(最多一次)
X*X出现0次或多次(可有可无)
X+X出现一次或多次(至少一次)
X{n}X正好出现n次
X{n, }X至少出现n次,无上限
X{n,m}X至少出现n次但不超过m次

二、Pattern

  • Pattern表示正则表达式。
  • 获取正则表达式对象:Pattern p = pattern.compile("Java\\d{0,2}");

三、Matcher

  • Matcher表示文本匹配器。
  • 按照正则表达式的规则去读取字符串,从头开始读取,在字符串中寻找符合匹配规则的子串。
  • 获取文本匹配器对象:Matcher m = p.matcher(str);
  • 获取是否有文本匹配:boolean b = m.find();

四、在字符串方法中的使用

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

1. matches

  • 格式:字符串.matches(正则表达式);
  • 作用:
    • 检验字符串是否满足规则
    • 在一段文本中查找满足要求的内容
public class Demo2 {
    public static void main(String[] args) {
        // 验证手机号
        String regex1 = "1[3-9]\\d{9}";
        System.out.println("13123456789".matches(regex1));  // true
        System.out.println("15712345678".matches(regex1));  // true
        System.out.println("131548582l".matches(regex1));   // false
        System.out.println("110".matches(regex1));          // false

        // 验证座机电话
        String regex2 = "0\\d{2,3}-?[1-9]\\d{4,9}";
        System.out.println("020-2341234".matches(regex2));  // true
        System.out.println("02021234".matches(regex2));     // true
        System.out.println("027-41234".matches(regex2));    // true
        System.out.println("0202-2341234".matches(regex2)); // true

        // 验证邮箱号码
        String regex3 = "\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
        System.out.println("323232@qq.com".matches(regex3));        // true
        System.out.println("zhangsan@163.com".matches(regex3));     // true
        System.out.println("zj003@pci.com.cn".matches(regex3));     // true
    }
}

2. replaceAll

  • 按照正则表达式的规则进行替换
public class Demo6 {
    public static void main(String[] args) {
        String s = "蔡徐坤fabdb2515sba肖战csnabdwa1212鹿晗";
        String result1= s.replaceAll("[\\w&&[^_]]+", "vs");
        System.out.println(result1);
    }
}

在这里插入图片描述

3. split

  • 按照正则表达式的规则切割字符串
import java.util.Arrays;

public class Demo6 {
    public static void main(String[] args) {
        String s = "坤坤fabdb2515sba战战csnabdwa1212鹿鹿";
        String[] result = s.split("[\\w&&[^_]]+");
        System.out.println(Arrays.toString(result));
    }
}

在这里插入图片描述

五、 Pattern+Matcher示例

1. 爬取数据

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo3 {
    public static void main(String[] args) {
        String str = "Java有Java8和Java11的长期维护版,最新版是Java19";
        // 获取正则表达式对象
        Pattern p = Pattern.compile("Java\\d{0,2}");
        // 获取文本匹配器对象
        Matcher m = p.matcher(str);
        // 循环获取子串
        while (m.find()) {
            System.out.println(m.group());
        }
    }
}

在这里插入图片描述

2. 有条件的爬取数据

package day16.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo4 {
    public static void main(String[] args) {
        String str = "Java有Java8和Java11的长期维护版,最新版是Java19";

        // 只要Java,不显示版本号
        System.out.println("---------只要Java,不显示版本号---------");
        String regex1 = "Java(?=\\d+)";
        test(str, regex1);
        // 只显示有版本号的Java
        System.out.println("---------只显示有版本号的Java---------");
        String regex2 = "Java(?:\\d+)";
        test(str, regex2);
        // 只显示没有版本号的Java
        System.out.println("---------只显示没有版本号的Java---------");
        String regex3 = "Java(?!\\d+)";
        test(str, regex3);
    }

    private static void test(String str, String regex) {
        Pattern compile = Pattern.compile(regex);
        Matcher matcher = compile.matcher(str);
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

在这里插入图片描述

六、贪婪爬取和非贪婪爬取

  • 贪婪爬取:爬取数据时尽可能的多获取数据
  • 非贪婪爬取:爬取数据时尽可能的少获取数据
  • +?*?表示非贪婪爬取。Java中,默认是贪婪爬取,如果要非贪婪爬取需要在数量词后面加上问号。

1. 贪婪爬取

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo5 {
    public static void main(String[] args) {
        String str = "Javaaaaaaaaabbbbbbbbaaaaaaaaaa有Java8和Java11的长期维护版,最新版是Java19";
        // 获取正则表达式对象
        Pattern p = Pattern.compile("ab+");
        // 获取文本匹配器对象
        Matcher m = p.matcher(str);
        // 循环获取子串
        while (m.find()) {
            System.out.println(m.group());
        }
    }
}

在这里插入图片描述

2. 非贪婪爬取

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo5 {
    public static void main(String[] args) {
        String str = "Javaaaaaaaaabbbbbbbbaaaaaaaaaa有Java8和Java11的长期维护版,最新版是Java19";
        // 获取正则表达式对象
        Pattern p = Pattern.compile("ab+?");
        // 获取文本匹配器对象
        Matcher m = p.matcher(str);
        // 循环获取子串
        while (m.find()) {
            System.out.println(m.group());
        }
    }
}

在这里插入图片描述

七、捕获分组和非捕获分组

  • 作用:用于后续还要继续使用本组的数据。
  • ()扩起来看成一组。
  • 每组都有组号,组号从1开始,以左括号为基准,连续不间断。
  • 使用捕获分组:
    • 正则内部:\\组号
    • 正则外部:$组号

1. 非捕获分组

  • 分组之后不需要再用本组数据,仅仅把数据扩起来。
  • 特点:不占用组号。
符号含义举例
(?:正则)获取所有Java(?:8|11|19)
(?=正则)获取前面部分Java(?=8|11|19)
(?!正则)获取不是指定内容的前面部分Java(?!8|11|19)

2. 内部使用捕获分组

public class Demo7 {
    public static void main(String[] args) {
        // 判断开始字符和结束字符是否一致
        String regex1 = "(.).+\\1";
        System.out.println("a123a".matches(regex1));  // true
        System.out.println("17891".matches(regex1));  // true
        System.out.println("&123&".matches(regex1));  // true
        System.out.println("a123b".matches(regex1));  // false

        // 判断开始字符串和结束字符串是否一致
        String regex2 = "(.+).+\\1";
        System.out.println("abc123abc".matches(regex2));  // true
        System.out.println("1^&7891^&".matches(regex2));  // true
        System.out.println("123123123".matches(regex2));  // true
        System.out.println("abc123bcd".matches(regex2));  // false

        // 判断开始字符串中每个字符一致,且开始字符串和结束字符串保持一致
        String regex3 = "((.)\\2*).+\\1";
        System.out.println("aaa123aaa".matches(regex3));  // true
        System.out.println("111789111".matches(regex3));  // true
        System.out.println("&&&123&&&".matches(regex3));  // true
        System.out.println("aab123aab".matches(regex3));  // false
    }
}

3. 外部使用捕获分组

public class Demo8 {
    public static void main(String[] args) {
        String str = "我要学学编编编程程程程程";
        String result = str.replaceAll("(.)\\1+", "$1");
        System.out.println(result);  // 我要学编程
    }
}

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

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

相关文章

【自然语言处理】主题建模:基于 LDA 实现

主题建模:基于 LDA 实现主题建模是一种常见的自然语言处理任务。隐含的狄利克雷分布(Latent Dirichlet Allocation,LDA)是其中一种实现算法,其核心思想如下图所示。 主题建模的方法也比较多,除了本文提到的…

MySQL架构概述

MySQL架构 对MySQL服务端架构的概述,包括逻辑架构、并发控制、事务和MVCC(多版本并发控制)等内容。 逻辑架构 连接/线程管理 最上层负责与客户端交互,包括连接处理、身份验证、确保安全性等。 解析器、优化器 MySQL核心能力都在…

机器学习从入门到进阶所需学习资料-包括书、视频、源码

本文整理了一些入门到进阶机器学习所需要的一些免费的精品视频课程,一些优质的书籍和经典的代码实战项目。本文整理自网络,源地址:https://github.com/linxid/Machine_Learning_Study_Path视频1.1 吴恩达老师机器学习课程:•Cours…

【【黑马SpringCloud(2)】微服务调用

服务调用和网关Feign远程调用Feign自定义配置Feign性能优化使用连接池代替默认的URLConnection解决重复代码继承方式抽取方式Gateway服务网关gateway快速入门断言过滤器全局过滤器过滤器执行顺序:跨域问题Feign远程调用 RestTemplate发起远程调用的代码&#xff1a…

走进 CSS

看完本篇博客,你能收获: 👉 了解 CSS 是什么?👉 学会 CSS 怎么用?👉 CSS的选择器👉 如何用 CSS 美化网页 文章目录01 CSS 是什么?02 CSS的发展史03 CSS 快速入门04 CSS的…

唯一索引范围查询锁 bug修复了

唯一索引范围查询锁 bug修复了 其他资料介绍入下: session A 是一个范围查询,按照原则 1 的话,应该是索引 id 上只加 (10,15] 这个 next-key lock ,并且因 为 id 是唯一键,所以循环判断到 id15 这一行就应该停止了。…

生成标题的节点

生成标题的节点目录概述需求:设计思路实现思路分析1.mine 的概述2 mi是否自动计算未来的处理人参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,w…

智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》

智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》 目录 智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》 1. 前言 2.车牌号码说明 3.车牌数据集CCPD (1)车牌数据集CCPD说明 (2&#xff09…

Eclipse调试python

Eclipse调试pythonF5:Step Into 单步调试,跳入函数内部F6:Step Over 单步调试,不跳入函数内部,执行当前代码F7:Step Return 返回到当前函数的尾部,跳转到调用函数的位置F8:Resume 跳…

DDOS渗透与攻防(二)之SYN-Flood攻击

系列文章 DDOS渗透与攻防(一)之拒绝服务攻击概念介绍 SYN-Flood攻击 1.SYN-Flood拒绝服务攻击 (1).攻击协议原理介绍说明_Syn-Flood SYN Flood (SYN洪水) 是种典型的DoS (Denial of Service,拒绝服务) 攻击。效果就是服务器TCP连接资源耗尽,停止响应…

8 种异步实现方式,性能炸裂!

异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:发送短信、邮件、异步更新等,这些都是典型的可以通过异步实…

LeetCode动态规划经典题目(九):0-1背包问题

学习目标: 0-1背包问题 学习内容: 9. LeetCode416. 分割等和子集https://leetcode.cn/problems/partition-equal-subset-sum/ 10. LeetCode1049. 最后一块石头的重量 IIhttps://leetcode.cn/problems/last-stone-weight-ii/ 学习产出: 独…

Makefile学习⑦:编译动态链接库和静态库

Makefile学习⑦:编译动态库和静态库 编译链接动态库 动态链接库名词解释: 动态:运行时才去加载,动态加载 链接:指库文件和二进制程序分离,用某种特殊手段维护两者之间的关系 库 :库文件&#…

8、条件语句

目录 一、简单的if条件语句 二、if…else语句 三、if…else if多分支语句 四、switch多分支语句 一、简单的if条件语句 语法如下: 布尔表达式:必要参数,表示最后返回的结果必须是一个布尔值。它可以是一个单纯的布尔变量或常量&#xff…

IntelliJ IDEA 插件推荐

本篇主要统计了一些 Idea 的常用插件 分享一下 感谢作者zzp google-java-format 作用 代码格式化风格。 插件官网 google-java-format - plugin for IntelliJ IDEs | JetBrains 使用说明 插件安装完成后需要到Preferences->Other Settings->google-java-format Set…

供应商管理难点在哪 SRM供应商系统助推企业提升管理水平

在如今,对于需求企业来说,要保证企业内部的正常生产或科研工作等过程的不间断,就需要有一批可靠的供应商定期提供必需的物资供应。而供应商管理的最终目的就是根据采购需求来建立一个稳定可靠的供应商管理队伍,为企业提供高质量的…

【Leetcode每日一题】27. 原地移除元素|神级理解双指针

博主简介:努力学习的预备程序媛一枚~博主主页: 是瑶瑶子啦所属专栏: LeetCode每日一题–进击大厂 目录题目描述题目分析:代码实现补充训练--验证代码实现题目描述 链接: 27. 移除元素 给你一个数组 nums 和一个值 val,你需要 原…

Java开发实现图书管理系统

本文用Java代码实现图书代码管理系统,有些地方可能会有纰漏,希望各位大佬鉴赏!! 文章目录 文章目录 一、Java实现图书管理系统 1.1创建book包 二、创建图书管理系统的操作包 2.1创建Operation接口 三、创建User包 3.1创建User类 四…

并发编程学习(七):线程活跃性:死锁、活锁、饥饿

线程活跃性 是指代码有限,但由于某种原因,导致线程一直未执行完成。 1、死锁 指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推…

四元数学习笔记(一):初识四元数

1 四元数的定义 1.1 为什么要使用四元数 旋转向量用 9 个量来描述 3 个自由度的旋转,具有冗余性;欧拉角和旋转向量是紧凑的,但是具有奇异性。事实上,我们找不到不带奇异性的向量描述方式。 回忆之前学习过的复数,我…