Java 正则表达式【非贪婪匹配、格式验证、反向引用、API】

非贪婪匹配

非贪婪匹配的元字符是问号

当此字符跟在任何其他限定符(*、+、?、{n}、{m}、{n,m})之后,匹配模式是 "非贪心的"。非贪心的意思就是每次匹配搜索到的尽可能短的字符串,可以是0个

案例

对比贪婪匹配和非贪婪匹配

贪婪匹配

public static void main(String[] args) {String content  = "hello1010";Pattern pattern = Pattern.compile("\\d+");Matcher matcher = pattern.matcher(content);while (matcher.find()){System.out.println(matcher.group(0));}}

输出结果:

1010

非贪婪匹配

public static void main(String[] args) {String content  = "hello1010";Pattern pattern = Pattern.compile("\\d+?");Matcher matcher = pattern.matcher(content);while (matcher.find()){System.out.println(matcher.group(0));}}

输出结果:

1
0
1
0

正则表达式应用实例

对字符串进行如下格式验证:

注意:格式验证不同于普通的匹配,格式匹配通常使用字符匹配符、定位符和限定符三种来进行匹配,尤其是限定符(定位符 ^ 、$),比如我们要判断 "123456"是不是三位数,如果我们使用如下的正则表达式:

\\d{3}

运行结果:

123
456

但其实是不匹配的,所以我们需要加定位符:

^\\d\\d{2}$

意思就是匹配以一位数字为开头,两位数字为结尾的字符串。

下面为了避免重复代码,我把模板放到这,只需要替换正则表达式的表达式即可。

        Pattern pattern = Pattern.compile("");Matcher matcher = pattern.matcher(content);if (matcher.find()){System.out.println("满足格式");}

1、汉字

汉字的编码为  \u0391 到 \uffe5。

^[\u0391-\uffe5]+$

2、邮政编码

要求:是1~9开头的一个六位数

^[1-9]\\d{5}$

3、QQ号码

要求:是1-9开头的一个(5-10位数)

^[1-9]\\d{4,9}$

4、手机号码

必须 13,14,15,18 开头的11位数。

我们可以使用小括号和竖线符号表示逻辑或,也可以使用中括号进行范围表示。

^(13|14|15|18)\\d{9}$
//或者
^(1[3458])\\d{9}$

5、URL

URL 的匹配很重要,尤其是在网络爬虫中会经常用到。

https://blog.csdn.net/m0_64261982?spm=1000.2115.3001.5343

正则表达式: 

^((http|https)://)?([\w-]+\.)+[\w-]+(\/[\w-?=&/%#.]*)?$

注意:我们这里的正则表达式中的括号都是捕获分组,如果希望不捕获的话,可以在左半括号加一个问号?,这样就成了非捕获分组,非捕获分组的内容不会保存到Matcher类中的groups数组中去,而捕获分组的内容会保存到内存中,可以通过Matcher.group(int group)的方式从groups数组提取出来或者显示命名的分组可以通过自定义的组名提取出来(详细可以看我第二篇博客关于捕获分组的部分)。 

System.out.println(matcher.group(0));    //https://blog.csdn.net/m0_64261982?spm=1000.2115.3001.5343
System.out.println(matcher.group(1));    //https://
System.out.println(matcher.group(2));    //https
System.out.println(matcher.group(3));    //csdn.
System.out.println(matcher.group(4));    ///m0_64261982?spm=1000.2115.3001.5343

其中:

^((https)://)?
https://这里用了非贪婪匹配,网址可以省去协议
([\\w-]+\\.)+[\\w-]+
blog.csdn.net
把带 '.' 的用([\\w-]+\\.)+ 来匹配,后缀 .com或者 .net 这些用 [\\w-]+ 来匹配
(\\/[\\w-?=&/%#.]*)?$
m0_64261982?spm=1000.2115.3001.5343
后面主要处理的就是一些特殊符号,看情况增加

注意: [?.*] 中括号里的点和问号只代表本身 没有特殊含义。

Pattern 类

之前我要做一些格式验证的话需要写很多代码,其实我们可以直接使用Pattern类中的一个matches方法,它可以对传入的正则表达式和字符串参数直接做一个整体匹配

比如,验证QQ号:

        System.out.println(Pattern.matches("^[1-9]\\d{4,9}$","3493247023"));

这样就可以极大地简洁代码,而不用去调用 Matcher 去一个个匹配。总之,Pattern.matches()适合做整体匹配,但不能做字符串中满足某一正则表达式的所有子串的匹配,所以看情况使用。

Matcher 类

 这里介绍一些Matcher对象的其他方法。

我们以如下字符串为例:

小美喜欢小明,小明也喜欢小美。

start 和 end 方法

start 和 end 会输出匹配到的字符串的下标

String content  = "小美喜欢小明,小明也喜欢小美。";Pattern pattern = Pattern.compile("喜欢");Matcher matcher = pattern.matcher(content);while (matcher.find()){System.out.println("=================");System.out.println(matcher.group(0));System.out.println(matcher.start());System.out.println(matcher.end());}

输出:

=================
喜欢
2
4
=================
喜欢
10
12

replaceAll 方法

把满足正则表达式的子串内容替换为参数的内容。

    String content  = "清华大学是中国著名的大学";Pattern pattern = Pattern.compile("清华");Matcher matcher = pattern.matcher(content);while (matcher.find()){String res = matcher.replaceAll("山西农业");System.out.println(res);}

输出:

山西农业大学是中国著名的大学

反向引用

反向引用和分组、捕获是有关系的,下面是反向引用的概念:

圆括号的内容被捕获后,可以在这个括号后使用,从而写出一个比较实用的匹配模式,这个我们称之为反向引用,这种引用既可以是在正则表达式内部,用 \\分组号;也可以是在正则表达式外部,用 $分组号

案例1-AA

匹配两个连续的相同数字。

(\\d)\\1

案例2-AAAAA

匹配五个连续的相同数字。

(\\d)\\1{4}

案例3-ABBA

找出字符串中所有满足 ABBA 型的子串。

​(\\d)(\\d)\\2\\1
String content = "12212121212222";String regex = "(\\d)(\\d)\\2\\1";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(content);while (matcher.find()){System.out.println(matcher.group());}

 

输出:

1221
2222

案例4

检索商品编号:形式如:12321-333999111 这样的号码,前面是一个五位数,然后是一个-,最后是一个AAABBBCCC型的9位数。

\\d{5}-(\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2}

案例5-结巴去重

 核心语句:(.)\\1+ 代表至少有两个重复字符的子串。

public static void main(String[] args) {String content = "我...我要...学学学学...Java!";// 1. 去掉所有的.Pattern pattern = Pattern.compile("\\.");Matcher matcher = pattern.matcher(content);content = matcher.replaceAll("");// 2. 去掉重复的字pattern = Pattern.compile("(.)\\1+");matcher = pattern.matcher(content); //matcher 对象需要重新赋值content = matcher.replaceAll("$1");System.out.println(content);
}

简洁写法:

content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");

输出:

我要学Java!

String 类中的正则表达式

1、String.replaceAll(String regex,String replacement)

将content中满足正则表达式regex的子串替换为 replacement。

2、public boolean matches(String regex)

判断字符串是否满足正则表达式regex,相当于Pattern.matches(String regex,String content)。

3、public String[] split(String regex)

按照正则表达式regex分割字符串

 

 

 

 

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

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

相关文章

30 | 中国高校数据分析

一、数据源 本项目使用了两个csv的数据文件,一个是中国高校(大学)的数据,一个是中国高校专业设置的数据 数据基本栏位:高校(大学)的数据高校专业设置的数据学校学校省份专业类别城市专业名称地址国家特色专业水平层次办学类别办学类型985211双一流二、数据分析目标 本…

电脑打开对话框中没有桌面这个选项解决办法

问题描述: 左侧栏中的桌面图标不显示 解决方法: 左侧的空白处右键-显示所有的文件夹 这时所有的文件夹都显示了!

从鲁大师十五年,寻找软件的生存法则

千禧之年,国内互联网用户数量首次突破1000万大关,互联网的腾飞正式拉开序幕。 从彼时算起,中国互联网发展也不过23年,而我们记忆中那个摇着蒲扇的老头,却占据了其中关键的十五年。 这十五年中有太多曾经为人熟知的软件…

pointpillars怎么查看tensorboard

在PointPillars中使用TensorBoard来可视化训练过程和模型性能是很常见的做法。TensorBoard是TensorFlow提供的一个强大的工具,用于可视化训练过程、模型图、损失曲线、准确率等。下面是在PointPillars中使用TensorBoard的一般步骤: 请注意,上…

CHATGPT源码简介与使用指南

CHATGPT源码的基本介绍 CHATGPT源码备受关注,它是一款基于人工智能的聊天机器人,旨在帮助开发者快速搭建自己的聊天机器人,无需编写代码。下面是对CHATGPT搭建源码的详细介绍。 CHATGPT源码的构建和功能 CHATGPT源码是基于Google的自然语言…

flutter开发实战-MethodChannel实现flutter与iOS双向通信

flutter开发实战-MethodChannel实现flutter与iOS双向通信 最近开发中需要iOS与flutter实现通信,这里使用的MethodChannel 如果需要flutter与Android实现双向通信,请看 https://blog.csdn.net/gloryFlow/article/details/132218837 这部分与https://bl…

Linux——基础IO(1)

目录 0. 文件先前理解 1. C文件接口 1.1 写文件 1.2 读文件 1.3 输出信息到显示器 1.4 总结 and stdin & stdout & stderr 2. 系统调用文件I/O 2.1 系统接口使用示例 2.2 接口介绍 2.3 open函数返回值 3. 文件描述符fd及重定向 3.1 0 & 1 & 2 3.2…

【Spring Cloud Alibaba】RocketMQ的基础使用,如何发送消息和消费消息

在现代分布式架构的开发中,消息队列扮演着至关重要的角色,用于解耦系统组件、保障可靠性以及实现异步通信。RocketMQ作为一款开源的分布式消息中间件,凭借其高性能、高可用性和良好的扩展性,成为了众多企业在构建高可靠性、高吞吐…

运维面试大全

文章目录 第一阶段平常怎么处理故障,思路是什么样的公网和私网分类以及范围,本机地址,网络地址,广播地址交换机的工作原理ICMP是什么干什么用的,它有哪些命令TCP和UDP协议的区别tcp有哪些控制位,分别是什么意思你是用过哪些Linux命令Linux 系统安全优化与内核优化经常使用…

stable diffusion 单张图片换头roop安装配置

1.首先安装秋叶大佬的webui 2.然后在拓展里面搜索roop,下载roop插件,然后重启webui 3.重启后,在文生图和图生图的界面,就可以看到roop的入口 4.这里面,需要提前安装Visual Studio. 勾选一些必要的选项,这里可以参照b站的视频 # 秋叶版本Stablediffusion的Roop插件的安装 …

JavaScript reduce深入了解

reduce() 是 JavaScript 数组的一个高阶函数,它允许你将数组中的元素按顺序依次合并为一个单一的值。reduce() 可以用于数组求和、计算平均值、连接字符串等各种情况。它的工作原理是通过迭代数组的每个元素,然后将元素和累加器进行某种操作,…

使用 Python 在 NLP 中进行文本预处理

一、说明 自然语言处理 (NLP) 是人工智能 (AI) 和计算语言学的一个子领域,专注于使计算机能够理解、解释和生成人类语言。它涉及计算机和自然语言之间的交互,允许机器以对人类有意义和有用的方式处理、分析…

Java # JVM内存管理

一、运行时数据区域 程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、运行时常量池、直接内存 二、HotSpot虚拟机对象 对象创建: 引用检查类加载检查分配内存空间:指针碰撞、空闲列表分配空间初始化对象信息设置(对象头内&#xff0…

​可视化绘图技巧100篇进阶篇(五)-阶梯线图(Step Chart)

目录 前言 图表类型特征 适用场景 图例 绘图工具及代码实现 ECharts SMARTBI

安卓中常见的字节码指令介绍

问题背景 安卓开发过程中,经常要通过看一些java代码对应的字节码,来了解java代码编译后的运行机制,本文将通过一个简单的demo介绍一些基本的字节码指令。 问题分析 比如以下代码: public class test {public static void main…

Java课题笔记~ JSP编程

4.1 JSP基本语法 JSP (全称Java Server Pages) 是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。 JSPHTMLJava JSP的本质是Servlet 访问JSP的时候&#x…

【设计模式】原型模式

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接…

javaScript:数组的认识与使用以及相关案例

目录 一.前言 二.数组 1.认识 2.数组的声明 1.let arr [1,2,3,4] 2.结合构造函数,创建数组 注意: 3.数组长度的设置和获取 注意 4.删除数组元素 5.清空数组 三.获取数组元素 获取数组元素的几种方法 1.使用方括号 [] 访问元素&#xff1…

Keepalived+Lvs高可用高性能负载配置

环境准备 IP配置VIPnode1192.168.134.170LVSKeepalived192.168.134.100node3192.168.134.172LVSKeepalived192.168.134.100node2192.168.134.171做web服务器使用node4192.168.134.173做web服务器使用 1、准备node1与node3环境(安装LVS与Keepalived)>…

基于微服务+Java+Spring Cloud +Vue+UniApp +MySql实现的智慧工地云平台源码

基于微服务JavaSpring Cloud VueUniApp MySql开发的智慧工地云平台源码 智慧工地概念: 智慧工地就是互联网建筑工地,是将互联网的理念和技术引入建筑工地,然后以物联网、移动互联网技术为基础,充分应用BIM、大数据、人工智能、移…