java正则表达式

2023-09-21 15:52:04

用于模式匹配,例如查询串中的数字、验证邮箱是否符合要求等。

在java中主要实现类有Pattern类、Matcher类。

Pattern类没有公共构造方法由静态方法Pattern.compile()构建,主要用于构造正则表达式并创建Matcher类。

Matcher类是对输入字符串进行解释和匹配的引擎。

实例演示

		//创建Pattern对象
		Pattern compile = Pattern.compile("^((http|https)://)?[\\w_.]+[/\\w?=&_]+");
        String s ="https://www.bilibili.com/video/BV1fh411y7R8?p=894&spm_id_from=pageDriver&vd_source=0a45c187143501cf39e6c09100236de9";
        //由Pattern对象生成matcher匹配引擎
        Matcher matcher = compile.matcher(s);
        //循环匹配
        while (matcher.find()){
            System.out.println(matcher.group(0));//group是分组匹配
        }

Matcher类常用方法

String replaceAll(String replacement); //将匹配上的字符替换成replacement,返回替换后的字符串
boolean matches(); //判断整个串是否完全被匹配

		Pattern compile = Pattern.compile("(\\d)(\\d)");
        String s="12ab";
        Matcher matcher = compile.matcher(s);
        String s2 = matcher.replaceAll("cd");
        System.out.println(s2);//cdab
        System.out.println(matcher.matches());//false 因为只有12被匹配上,不属于完全被匹配。

String类常用方法(可以直接对String字符串进行正则表达式匹配)

String replaceAll(String regex, String replacement)
String[] split(String regex)
boolean matches(String regex)

正则表达式匹配符

需要用转义符//的 .*+()$/?[]^{}

[]      接收其中的一个字符  
[^abcd] 除了abcde接收一个字符 
.       匹配除了\n的任意一个字符 
\\d     匹配一个数字相当于[0-9] 
\\D     匹配一个非数字 
\\d\\d? ?表示匹配0~1个,这里是匹配1个或两个数字 
\\w     匹配单个数字或大小写字母下划线 
\\W     匹配单个非数字大小写字母下划线 
\\d+    匹配1个或多个数字 
\\W+\\d 匹配以非数字字母开头,数字结尾的串 
(?i)abc 匹配abc不区分大小写
a(?i)b  匹配ab,b不区分大小写 
 Pattern compile1 = Pattern.compile("abc",Pattern.CASE_INSENSITIVE); //不区分大小写 
\\s     匹配空格或制表符 
\\S     匹配非空白字符

选择匹配符

ab|bc 匹配单个ab或者cd

Pattern compile = Pattern.compile("ab|bc");
String s="abbc";

最终匹配结果为:ab 、bc

限定符:

*    匹配0次或多次
+    匹配1次或多次
?    匹配0次或1次
{n}  匹配长度为n
{n,} 至少匹配长度n
{n,m}匹配长度为n到m

定位符

^   指定起始字符  ^[0-9]abc匹配数字开头abc为尾
$   指定结束字符  ^[0-9]\\-[a-z]+ $ 数字开头-字母结尾
\\b 匹配边界  hs\\b只能匹配右侧边界的“hs”
\\B 匹配左边界

分组匹配

分组匹配主要分为非命名捕获、命名捕获,顾名思义区别是分的组有没有被命名。

非命名捕获

用括号包起来就算一组,获取结果时可以用group(i)来获取第i组的串,用group(0)获取整组的匹配结果。

 		Pattern compile = Pattern.compile("(\\d)(\\d)");

        String s="1234";

        Matcher matcher = compile.matcher(s);
        while (matcher.find()){
            System.out.println("整组:"+matcher.group(0));
            System.out.println("第一组:"+matcher.group(1));
            System.out.println("第二组:"+matcher.group(2));
        }

group是什么?
这涉及到Matcher底层的一个groups数组,每次在匹配成功时groups数组会被赋值以记录匹配串的位置和各个组串的位置。

groups[0-1]记录整个匹配的结果,groups[2-3]记录第一个组的结果…每次通过match.group(i)会将groups[i2~i2+1]的串拼接作为返回值返回。

public String group(int group) {      
        if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
            return null;
        return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();
    }

非命名捕获

在分组的括号前加入?<组名>即可为分组命名,获取分组时可按照分组名来获取。

  Pattern compile = Pattern.compile("(?<g1>\\d)(?<g2>\\d)");//分g1,g2组两组
  String s ="12345678";
        Matcher matcher = compile.matcher(s);
        while (matcher.find()){
            System.out.println("g1组结果:"+matcher.group("g1"));
            System.out.println("g2组结果:"+matcher.group("g1"));
        }

反向引用

正则表达式内部可以用\\i代替第i个分组,外部可以用$i替代第i个分组

需求:用正则表达式匹配4个数字的串,要求第一个数字与最后一个数字相同,第二个数字与第三个数字相同。如1221
这样的需求该怎么做?可以用分组加上反向引用即用\1\2代替分组的子串

Pattern compile = Pattern.compile("(\\d)(\\d)\\2\\1");

需求2:去除重复的数字,如112233 ->123

		Pattern compile = Pattern.compile("(.)\\1+");//匹配相同的串,每次会匹配到11、22、33
        String s="112233";
        Matcher matcher = compile.matcher(s);
        String s2 = matcher.replaceAll("$1");//匹配到11时用分组1(1)替代,匹配到22时用分组1(2)替代....
        System.out.println(s2);//123

非贪婪匹配

什么是贪婪匹配?正则表达式匹配会尽可能匹配长度最大的串。 在str=“111"时,用正则表达式”\d+"去匹配则会得到111。非贪婪匹配则会分3次得到1,1,1

Pattern compile = Pattern.compile(“\d+?”);
在匹配的后面加个?每次可尽可能少的匹配。

案例

1.判断输入是否全为汉字汉字

Pattern compile = Pattern.compile("^[\\u0391-\\uffe5]+$");

2.验证邮政编码 (是1-9开头的6位数 如:12306)

Pattern compile = Pattern.compile("^[1-9]\\d{5}$");

3.验证QQ号1-9开头的5~10位数

Pattern compile = Pattern.compile("^[1-9]\\d{4,9}$");

4.手机号(必须以13,14,15开头的11位数)

Pattern compile = Pattern.compile("^1[3|4|5|8]\\d{9}$");
更多推荐

Android 显示surfaceFlinger vsync 获取

文章目录vsync的概念vsync应用层获取的方式vsync信号传递vsync的概念vsync简单理解就是一帧图像在显示设备这边显示完成之后(图像从左上角扫描到了右下角了)发送的第一个硬件vsync信号,显示设备重新回到左上角开始显示的时候会在发第二个vsync信号。在发送第一个vsync信号出来的时候,上层要开始准备

IP归属地在金融行业的应用场景

IP归属地查询在各大行业当中的利用率可以说非常的高了,提供了各种的保障,比如安全保障、数据保障、性能保障等等。今天我就来详细说一说IP归属地在金融行业的应用场景有哪些?用途一:通过解析用户IP地址所处的区县位置与表单填写位置或者GPS位置进行交叉验证,判断位置是否一致;用途二:识别来自高危地区的IP地址,如缅甸、老挝;

【面试题】—— 笔试题(4题)

文章目录1.分割集合第一种方式:自己实现分割方法第二种方式:使用第三方依赖2.链表计算3.字符串计算4.找到相加为0的数字1.分割集合题目:编写一个Java函数,实现批量获取数据的功能(BService.get(Listids))。具体要求如下:1)提供一个函数BService.get(Listids),支持最多传入1

使用Jmeter+ant进行接口自动化测试(数据驱动)

最近在做接口测试,因为公司有使用jmeter做接口测试的相关培训资料,所以还是先选择使用jmeter来批量管理接口,进行自动化测试。话不多说,进入正题:1.使用csv文件保存接口测试用例,方便后期对接口进行维护(先新建txt文件,然后文件扩展名改为.csv,不要新建xls再改为csv,不然会出现读取不到文件的情况)注意

【C语言学习笔记---指针进阶02】

C语言程序设计笔记---017C语言进阶之回调函数1、函数指针数组2、回调函数3、回调函数的应用---qsort库函数4、模拟qsort函数5、结语C语言进阶之回调函数前言:通过C语言进阶前篇的指针进阶01的知识,继续学习。这篇引用一个简易计算器的程序进行深入学习指针进阶的知识。/知识点汇总/1、函数指针数组比如:指针

认识Redis

文章目录为什么需要使用缓存中间件提高读取性能降低数据库负载提高可伸缩性降低外部依赖提高用户体验缓存数据一致性应对突发流量缓存的类型本地缓存分布式缓存内存缓存磁盘缓存缓存代理什么是RedisRedis和Memcached对比数据结构支持持久化支持数据查询和操作数据复制和分布式内存管理:生态系统和支持库应用场景总结为什么用

【大数据】Doris 构建实时数仓落地方案详解(二):Doris 核心功能解读

本系列包含:Doris构建实时数仓落地方案详解(一):实时数据仓库概述Doris构建实时数仓落地方案详解(二):Doris核心功能解读Doris构建实时数仓落地方案详解(三):Doris实时数仓设计Doris构建实时数仓落地方案详解(二):Doris核心功能解读1.Doris发展历程2.Doris三大模型3.Doris

Wireshark TS | MQ 传输缓慢问题

问题背景应用传输慢是一种比较常见的问题,慢在哪,为什么慢,有时候光从网络数据包分析方面很难回答的一清二楚,毕竟不同的技术方向专业性太强,全栈大佬只能仰望,而我们能做到的是在专注于自身的专业方向之外,尽量扩展知识面,学会找出问题的规律,并提出可能的解决建议。就像本次MQ案例一样,说实话我对MQ一无所知,但并不会让我们在拿

haproxy工具,负载均衡配置,反向代理配置,动静分离,高可用等等

文章目录haproxyhaproxy概述haproxy配置文件解析haproxy实战haproxy配置过程haproxy负载均衡和反向代理haproxy查看状态信息Haproxy健康检查功能基于tcp端口的健康检查基于URL的健康检查haproxy的高可用--不需要keepalived获取真实ip地址haproxy动静

CSS 实现祥云纹理背景

🪴背景最近掘金出来一个中秋创意活动,我准备参加一下。作品方向选择用纯css做一个中秋贺卡,其中有一些中秋的元素和一些简单的动画,而贺卡背景的实现就是本文要讲的内容。中秋贺卡成果图(生成gif有点失真😵‍💫)如下:有兴趣的可以看我的另一篇文章:中秋贺卡传送门贺卡背景是我用css,仿照从网上搜到的祥云纹理背景图实现的

CSS中去掉li前面的圆点方法

1.引言在网页开发中,我们经常会使用无序列表(<ul>)来展示一系列的项目。默认情况下,每个列表项(<li>)前面都会有一个圆点作为标记。然而,在某些情况下,我们可能希望去掉这些圆点,以满足设计需求或者个性化要求。本文将介绍几种常见的方法来去掉<li>前面的圆点。2.使用CSS属性我们可以使用CSS的list-styl

热文推荐