Java 中的正则表达式

news2024/11/14 21:55:04
  • 转义字符由反斜杠\x组成,用于实现特殊功能
  • 当想取消这些特殊功能时可以在前面加上反斜杠\

例如在Java中当\出现时是转义字符的一部分,具有特殊意义,前面加一个反斜可以取消其特殊意义,表示1个普通的反斜杠\,\\\\表示2个普通的反斜杠\\。其实就是要求Java中的字符串输出结果是正确的正则表达式。

1. 概念

正则表达式其实就是规则。

2. 字符类

  • 单字符匹配规则,语法示例:
  1. [abc]:a 或者 b,或者 c 字符中的一个;
  2. [^abc]:除 a,b,c 以外的任何字符中的一个;
  3. [a-z]:a-z 小写字母中的一个;
  4. [A-Z]:A-Z 大写字母中的一个;
  5. [0-9]:0-9 数字中的一个;
  6. [a-zA-Z0-9]:a-z 或者 A-Z 或者 0-9 中的一个;
  7. [a-dm-p]:a 到 d 或 m 到 p 中的一个。

3. 逻辑运算符

  • 语法示例:  
  1. &&:并且
  2. | :或者

4. 预定义字符

  • 语法示例:
  1. “.” : 匹配任何字符;
  2. “\d”:任何数字 [0-9] 的简写;
  3. “\D”:任何非数字 [^0-9] 的简写;
  4. “\s”: 空白字符 [ \t\n\x0B\f\r] 的简写;
  5. “\S”: 非空白字符 [^\s] 的简写;
  6. “\w”:大小字母或数字或下划线或汉字;
  7. “\W”:非单词字符 [^\w] ;
  8. “\t”:一个 Tab 的间隔。

5. 数量词

  • 语法示例:
  1. X? : 0 次或 1 次;
  2. X* : 0 次或者多次;
  3. X+ : 1 次或者多次;
  4. X{n} : 正好好 n 次;
  5. X{n,} : 至少 n 次;
  6. X{n,m}: n 到 m 次(n 和 m 都是包含的)

正则表达式的作用:

(1)检验字符串是否满足某些规则。

(2)查找一段文本中满足某些规则的内容。

1、下面是作用1:检验字符串是否满足某些规则的练习

(1)请编写正则表达式验证用户输入的手机号码是否满足要求。

  •  中国手机号码是以 13、14、15、16、17、18、19 开头的11位数字:1[3-9]
    String regex = "1[3-9]\\d{9}";
    System.out.println("15236302279".matches(regex));

(2)请编写正则表达式验证用户输入的邮箱号是否满足要求。

  • 邮箱包括用户名和域名两部分,它们之间由@符号连接
  • 用户名包括字母、数字和下划线,至少有一个字符:\\w+
  • 域名包括两部分:邮箱服务提供商和域名
  • 邮箱服务提供商:任意的字母加数字,总共出现2-7次:[\\w&&[^_]]{2,7}
  • 域名:大小写字母,如.com,.cn,.edu.cn等,出现2-3次:(\\.[a-zA-Z]+){1,2}
    String regex2 = "\\w+@[\\w&&[^_]]{2,7}(\\.[a-zA-Z]+){1,2}";
    System.out.println("liuyujie@163.com".matches(regex2));

(3)请编写正则表达式验证用户输入的座机号码是否满足要求。

  • 座机号码包括区号和电话号码两部分,它们之间通常用连字符 - 隔开。有时候也可以省略连字符。
  • 区号一般是3位或4位数字,第一位是0:0\\d{2,3}
  • 连字符-,有时也可省略:-?
  • 电话号码一般是7位或8位数字,第一位不能为0:\\d{7,8}。
    String regex3 = "0\\d{2,3}-?\\d{7,8}";
    System.out.println("010-12345678".matches(regex3));

2、查找一段文本中满足某些规则的内容

练习:

  1. 首先获取正则表达式的对象;
  2. 然后获取文本匹配器的对象;
  3. find()方法:文本匹配器从头开始读取,寻找是否有满足规则的子串。如果没有,方法返回false;如果有,返回true。在底层记录子串的起始索引和结束索引+1。
  4. group()方法:方法底层会根据find方法记录的索引进行字符串的截取,其实就是利用substring(起始索引,结束索引);包头不包尾,把截取的小串进行返回。
     //1.获取正则表达式的对象
    Pattern p = Pattern.compile("Java\\d{0,2}");
    //2.获取文本匹配器的对象
    //m去读取text,找符合p规则的子串
    Matcher m = p.matcher(text);

    //3.利用循环获取
    while (m.find()) {
        String s = m.group();
        System.out.println(s);
    }

有如下文本,按要求爬取数据。

Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台。

需求1:爬取版本号为8,11.17的Java文本,但是只要Java,不显示版本号。

需求2:爬取版本号为8,11,17的Java文本。正确爬取结果为:Java8 Java11 Java17 Java17

需求3:爬取除了版本号为8,11,17的Java文本。

6. 零宽断言和负向零宽断言

  1. (?=...) 用于查找在某些内容(但并不包括这些内容)之前的东西。
  2. (?!...) 排除某些内容的匹配。例如:\d{3}(?!\d),首先匹配三位数字,然后这三位数字的后面不能是数字。
  3. (?:...)用来对表达式进行分组,但是不会捕获。例如:表示匹配 "Java" 这个单词,但不会把它作为一个捕获组,因此不能通过后向引用\1等方式再次使用这个匹配结果。
        String s = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
            "因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";

        //1.定义正则表达式
        //?指代前面的数据Java
        //=表示在Java后面要跟随的数据
        //但是在获取的时候,只获取前半部分
        //需求1:
        String regex2 = "((?i)Java)(?=\\d{1,2})";
        //需求2:
        String regex2 = "((?i)Java)(\\d{1,2})";
        String regex3 = "((?i)Java)(?:\\d{1,2})";
        //需求3:
        String regex4 = "((?i)Java)(?!\\d{1,2})";

        Pattern p = Pattern.compile(regex4);
        Matcher m = p.matcher(s);
        while (m.find()) {
            System.out.println(m.group());
        }

7. 贪婪匹配和懒惰匹配

  1. 贪婪匹配:匹配尽可能多的字符。
  2. 懒惰匹配:匹配尽可能少的字符。
  3. 正则表达式在匹配多个字符时尽可能多,默认是贪婪匹配;如果在后面加上?则表示懒惰匹配,如 +? 表示懒惰匹配。

8. 忽略大小写

  1. (?i) :在开头使用表示接下来所有的数据都忽略大小写,但是一个字符串中如果只想忽略某个字符的大小写,可以这样写:a((?i)b)c,只忽略字母b的大小写,a和c只能是小写。

9. 捕获分组和非捕获分组

  1. 捕获分组是用()定义的分组,它可以把匹配到的内容保存到一个单独的组中,以便后续引用或者在匹配后进行处理。
  2. (?:) (?=) (?!)都是非捕获分组,更多的使用(?:...)这样的语法来剥夺一个分组对组号分配的参与权。

10. 分组组号

  1. ()表示捕获分组。
  2. 组号如何识别?从左往右,左括号是第几个就是第几组,组号是连续不间断的。
  3. \\X:表示把第X组的内容再出来用一次。

需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符。

  • 用.来匹配第一个字符。
    String regex = "(.).*\\1";
    System.out.println("a121a".matches(regex));

需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符。

    String regex2 = "(.+).*\\1";
    System.out.println("abc123abc".matches(regex2));

需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要一致。

    String regex3 = "((.)\\2*).*\\1";
    System.out.println("aaa123aaa".matches(regex3));

需求4:将字符串“我要学学编编编编程程程程程程”替换为“我要学编程”,即将重复的字符替换为单个字符。

  • 如何获取一段文本中重复2次及以上的字符?(.)\\1+
  • 字符串的replaceAll和split两个方法都可以使用正则表达式
  • 在正则表达式外使用分组,格式为$X,其中X为组号
    String text = "我要学学编编编编程程程程程程";
    String regex = "(.)\\1+";
    System.out.println(text.replaceAll(regex, "$1"));

结合需求1-3以及4的思考: 

public class RegexDemo7 {
    public static void main(String[] args) {
        String text = "1a222a";
        String regex1 = "(.).*\\1";
        Pattern p = Pattern.compile(regex1);
        Matcher m = p.matcher(text);
        while (m.find()) {
            String s = m.group();
            System.out.println(s);
        }
    }
}

输出结果 

 

当文本为下面这个时输出结果为 

    String text = "1a121a";

 

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

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

相关文章

Java从入门到精通(第4版)中文电子版

前言 针对编程语言JAVA相关知识进行了精密的讲解,全册分为28章,含基础知识、核心知识、高级应用3大核心模块,具体细分又包括初识Java,类的高级特性,流程控制,字符串,数组,数据库操作…

团队提效探索:市场上最好的10款项目工单管理工具对比

本文将分享2024年值得关注的10款项目工单管理系统:PingCode、Worktile、蓝凌OA、禅道、泛微E-office、Teambition、monday.com、Basecamp、ProofHub、Wrike。 你是否曾经因为项目进度混乱而感到头疼,或是在处理大量任务时不知所措?在项目管理…

探索编程世界的乐趣:《C++青少年趣味编程108例》

💂 个人网站:【 摸鱼游戏】【网址导航】【神级代码资源网站】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…

TinyVue v3.17.0 正式发布,推出了一款基于 Quill 2.0 的富文本编辑器,功能强大、开箱即用!

本文由体验技术团队Kagol老师原创~ 我们非常高兴地宣布,2024年6月26日,TinyVue 发布了 v3.17.0 🎉。 TinyVue 每次大版本发布,都会给大家带来一些实用的新特性,上一个版本我们重构了 chart-core,新增 Circ…

算法2--贪心算法

1.老鼠和猫的交易 小老鼠准备了M磅的猫粮,准备去和看守仓库的猫做交易,因为仓库里有小老鼠喜欢吃的五香豆。 仓库有N个房间; 第i个房间有 J[i] 磅的五香豆,并且需要用 F[i] 磅的猫粮去交换; 老鼠不必交换该房间所有的五…

笔记 5 :linux 0.11 注释,函数 copy_mem() , copy_process () , 中断函数 int 80H 的代码框架

(38)接着介绍一个创建进程时的重要的函数 copy_mem() 函数: (39) 分析另一个关于 fork() 的重要的函数 copy_process(),与李忠老师的操…

暑期-大数据人工智能学习-在线实习项目

这个暑期 默默努力一把 悄悄惊艳所有人 在线企业项目试岗实训 助你突破固有思维模式,伴你进阶成长

MySQL索引特性(下)

目录 索引的理解 理解单个Page 理解多个Page 页目录 单页情况 多页情况 复盘一下 聚簇索引VS非聚簇索引 区别 索引操作 主键索引 唯一索引的创建 普通索引的创建 查询索引 删除索引 索引创建原则 索引的理解 理解单个Page MySQL 中要管理很多数据表文件,而…

阿里云ECS跨区域迁移,利用老操作系统作为新服务操作系统

由于特殊原因或者数据备份需要迁移ecs服务器 1.老服务快照 选择ecs实例,点开实例 进入云盘 https://ecs.console.aliyun.com/disk 在云盘上点击建立快照 2.准备oss同源 购买oss 存储,用于临时备份 https://oss.console.aliyun.com/bucket/ 记得必…

Spring如何进行动态注册Bean

在Spring框架中,Bean是应用程序的核心组成部分,而BeanDefinition则是这些Bean的元数据表示。随着应用程序的复杂性增加,我们可能需要更灵活地定义和注册Bean。Spring框架提供了几个扩展点,允许我们以编程方式影响Bean的创建和定义…

Window中 Redis下载安装

Redis7.2.3连接: 我用夸克网盘分享了「redis-windows-7.2.3.zip」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链接:https://pan.quark.cn/s/4dfb0497707a 在安…

Uniapp基础篇(持续更新)

1. Uni-app常用内置组件 view 视图容器 scroll-view 可滚动视图区域,用于区域滚动。需注意在webview渲染的页面中,区域滚动的性能不及页面滚动。 swiper 滑块视图容器。一般用于左右滑动或上下滑动,比如banner轮播图。 image uniapp官方iam…

封装网络请求 鸿蒙APP HarmonyOS ArkTS

一、效果展示 通过在页面直接调用 userLogin(params) 方法,获取登录令牌 二、申请网络权限 访问网络时候首先需要申请网络权限,需要修改 src/main 目录下的 module.json5 文件,加入 requestPermissions 属性,详见官方文档 【声明权…

Flink底层原理解析:案例解析(第37天)

系列文章目录 一、flink架构 二、Flink底层原理解析 三、Flink应用场景解析 四、fink入门案例解析 文章目录 系列文章目录前言一、flink架构1. 作业管理器(JobManager)2. 资源管理器(ResourceManager)3. 任务管理器(Ta…

Hadoop安装报错

报错:ERROR 2023-03-09 21:33:00,178 NetUtil.py:97 - SSLError: Failed to connect. Please check openssl library versions. 解决方案: 在安装失败得客户端执行 编辑 /etc/python/cert-verification.cfg 配置文件,将 [https] 节的 verify 项 设为禁用…

【教学类-67-02】20240716毛毛虫ABB排序

背景需求: 【教学类-67-01】20240715毛毛虫AB排序-CSDN博客文章浏览阅读584次,点赞16次,收藏6次。【教学类-67-01】20240715毛毛虫AB排序https://blog.csdn.net/reasonsummer/article/details/140443310 在AB排序基础上,继续制作…

【JavaEE精炼宝库】 初识网络原理——网络通信基础 | 协议

文章目录 一、网络发展史1.1 独立模式:1.2 网络互连:1.3 局域网(LAN):1.4 广域网(WAN): 二、网络通信基础2.1 IP地址:2.2 端口号: 三、协议3.1 协议的概念&am…

RabbitMQ:基础篇

1.RabbitMQ是高性能的异步通讯组件 何为异步通讯 打电话就是同步通讯,微信聊天可以理解为异步通讯,不是实时的进行通讯:时效性差。 同步调用的缺点: 拓展性差(需求不尽提) 性能下降 级联失败 …

实时高清无延迟:EasyDSS/EasyCVR无人机直播技术重塑赛事新体验

近日有网友发视频称,在内蒙古呼伦贝尔一景区的马术表演现场,一架无人机擅自在场地上空飞行拍摄。现场工作人员多次制止飞行无果,一名表演者骑马用弓箭将无人机射落。 在数字科技日新月异的今天,无人机直播推流技术以其独特的视角…

在GPU上运行PyTorch

文章目录 1、查看GPU的CUDA版本2、下载CUDA版本3、安装cuDNN4、配置CUDA环境变量5、安装配置Anaconda6、使用Anaconda7、pycharm导入虚拟环境8、安装带GPU的PyTorch⭐9、总结 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主&#x…