Java 中的正则表达式

  • 转义字符由反斜杠\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.mfbz.cn/a/797570.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《python程序语言设计》2018版第5章第55题利用turtle黑白棋盘。可读性还是最重要的。

今天是我从2024年2月21日开始第9次做《python程序语言设计》作者梁勇 第5章 从2019年夏天的偶然了解python到2020年第一次碰到第5章第一题。彻底放弃。再到半年后重新从第一章跑到第五章,一遍一遍一直到今天2024.7.14日第9次刷第五章。 真的每次刷完第五章感觉好像…

【题解】42. 接雨水(动态规划 预处理)

https://leetcode.cn/problems/trapping-rain-water/description/ class Solution { public:int trap(vector<int>& height) {int n height.size();// 预处理数组vector<int> lefts(n, 0);vector<int> rights(n, 0);// 预处理记录左侧最大值lefts[0] …

Python应用 | 基于flask-restful+AntDesignVue实现的一套图书管理系统

本文将分享个人自主开发的一套图书管理系统&#xff0c;后端基于Python语言&#xff0c;采用flask-restful开发后端接口&#xff0c;前端采用VueAntDesignVue实现。对其他类似系统的实现&#xff0c;比如学生管理系统等也有一定的参考作用。有问题欢迎留言讨论~ 关注公众号&am…

最新Wireshark查看包中gzip内容

虽然是很简单的事情&#xff0c;但是网上查到的查看gzip内容的方法基本都是保存成zip文件&#xff0c;然后进行二进制处理。 其实现在最新版本的Wireshark已经支持获取gzip内容了。 选中HTTP协议&#xff0c;右键选择[追踪流]->[HTTP Stream] 在弹出窗口中&#xff0c;已…

mavsdk_server安卓平台编译

1.下载好mavsdk并进入mavsdk目录 2.生成docker安卓平台文件 docker run --rm dockcross/android-arm64 >./dockcross-android-arm64 3.生成makefile ./dockcross-android-arm64 cmake -DCMAKE_BUILD_TYPERelease -DBUILD_MAVSDK_SERVERON -DBUILD_SHARED_LIBSOFF -Bbuild/…

专业条码二维码扫描设备和手机二维码扫描软件的区别?

条码二维码技术已广泛应用于我们的日常生活中&#xff0c;从超市结账到公交出行&#xff0c;再到各类活动的入场验证&#xff0c;条码二维码的便捷性不言而喻&#xff0c;而在条码二维码的扫描识别读取过程中&#xff0c;专业扫描读取设备和手机二维码扫描软件成为了两大主要工…

【计算机毕业设计】003基于weixin小程序教学辅助

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【Java】字符与字符串

1.字符char 字符数据类型用于表示单个字符。 字符数据类型char用于表示单个字符。字符型字面值用单引号括住。 char a A; char b 4; char c \u041; // A的Unicode字符串字面值必须括在双引号中。而字符字面值是括在单引号中的单个字符。因此"A"是一个字符串&…

视频号里的视频怎么下载保存?推荐5种方法!

很多人不知道视频号里的视频怎么下载保存&#xff0c;其实视频号下载提取方式比较多常见的有缓存、查看源代码、抓包、录屏、自动提取工具。 1&#xff1a;缓存 安卓手机特性将需要的视频观看完并缓存到手机&#xff0c;并将视频另外存为mp4文件&#xff0c;不过该方式最安卓1…

【扩散模型】【图像生成】FreeU:扩散 U-Net 模型的免费午餐(CVPR 2024 Oral))

论文名称&#xff1a;FreeU: Free Lunch in Diffusion U-Net (CVPR 2024 Oral) 论文地址&#xff1a;https//arxiv.org/pdf/2309.11497 项目链接&#xff1a;https//chenyangsi.top/FreeU/ 文章目录 摘要一、 扩散 U-Net 中的低频和高频分量二、扩散 U-Net 是如何执行去噪过程…

excel、word、ppt 下载安装步骤整理

请按照我的步骤开始操作&#xff0c;注意以下截图红框标记处&#xff08;往往都是需要点击的地方&#xff09; 第一步&#xff1a;下载 首先进入office下载网址&#xff1a; otp.landian.vip 然后点击下载 拉到下方 下载站点&#xff08;这里根据自己的需要选择下载&#x…

VLM技术介绍

1、背景 视觉语言模型&#xff08;Visual Language Models&#xff09;是可以同时从图像和文本中学习以处理许多任务的模型&#xff0c;从视觉问答到图像字幕。 视觉识别&#xff08;如图像分类、物体保护和语义分割&#xff09;是计算机视觉研究中一个长期存在的难题&#xff…

Excel第31享:基于left函数的截取式数据裂变

1、需求描述 如下图所示&#xff0c;在“Excel第30享”中统计2022年YTD各个人员的“上班工时&#xff08;a2&#xff09;”&#xff0c;需要基于工时明细表里的“日期”字段建立辅助列&#xff0c;生成“年份”字段&#xff0c;本文说明“年份”字段是怎么裂变而来的。 下图为…

前端web性能统计

前端web性能统计 1. 背景2. 业界方案2.1 腾讯2.2 蚂蚁金服2.3 字节跳动2.4 美团 3. 相关观念3.1 RAIL模型3.2 性能指标3.3 真实用户监控3.4 performance 4. 性能监控工具介绍5. 推荐采用方案 1. 背景 在如今的数字时代&#xff0c;网站和应用程序的性能对用户体验至关重要。用…

13_Shell系统函数

13_Shell系统函数和自定义函数 一、系统函数 basename 获取文件名 #!/bin/bash#basename 相对路径文件名 basename ./1.sh#basename 绝对路径文件名 basename /tmp/1.sh#basename 去除文件后缀名 basename /tmp/1.sh .shdirname 获取文件所在目录名 #!/bin/bash#dirname 相对路…

【web】-sql注入-login

根据网址提示打开如图&#xff1a; 查看源代码前台并没有过滤限制、扫描后台也没有发现特殊文件。看到标题显示flag is in database&#xff0c;尝试sql注入。 由于post,bp抓包如下&#xff1a; 运行python sqlmap.py -r 1.txt --dump 获取flag 42f4ebc342b6ed4af4aadc1ea75f…

在word中删除endnote参考文献之间的空行

如图&#xff0c;在References中&#xff0c;每个文献之间都有空行。不建议手动删除。打开Endnote。 打开style manager 删除layout中的换行符。保存&#xff0c;在word中更新参考文献即可。

【自学网络安全】二、防火墙NAT智能选路综合实验

任务要求&#xff1a; &#xff08;衔接上一个实验所以从第七点开始&#xff0c;但与上一个实验关系不大&#xff09; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总…

中小学校园EasyCVR视频综合监管方案:构建安全、智能的校园环境

一、背景需求分析 随着科技的快速发展&#xff0c;校园安全问题日益受到社会各界的关注。尤其是在中小学校园中&#xff0c;学生的安全更是牵动着每一个家庭的心。为了更有效地保障学生的安全&#xff0c;提高校园安全管理水平&#xff0c;视频监控系统在中小学中的应用越来越…

TikTok 入局小游戏,小游戏出海赛道大热,开发者如何抢滩海外市场?

国内小游戏市场的竞争日益激烈&#xff0c;开发成本上涨、买量的投入成本飙升&#xff0c;对小团队和个人开发者的资金要求量高。除此以外&#xff0c;单款游戏从软著、备案、到认证所需要的时间和费用都大幅提升&#xff0c;也对小游戏市场造成重大影响。重压之下&#xff0c;…