首页 > 编程语言 >Java登陆第十七天——正则表达式

Java登陆第十七天——正则表达式

时间:2023-12-04 22:37:15浏览次数:28  
标签:Java String 正则表达式 matcher 规范 第十七 compile Pattern 字符串

在java.util.regex包下,提供了正则表达式对字符串进行约束规范匹配

正则表达式必须依靠Pattern类和Matcher类。

Pattern

Pattern类的主要作用是编写正则规范。常用方法如下:

方法 类型 描述
public static Pattern compile(String regex) 静态方法 传入正则表达式规则,并返回Pattern实例
public Matcher matcher(CharSequence input) 普通方法 传入待验证字符串,并返回Matcher实例

Matcher

Matcher类的主要作用是执行规范,验证一个字符串是否符合其规范。常用方法如下:

方法 类型 描述
public boolean find() 普通方法 是否有符合规范的子字符串
public String group() 普通方法 返回符合规范的子字符串
public boolean matches() 普通方法 整个字符串是否符合规则

(子字符串:原有字符串中解析出的字符串)

正则表达式规范

常用正则表达式如下:

规范 描述 规范 描述
\\ 表示反斜杠( \ )字符 \w 字母、数字、下划线
[abc] a或b或c \W 非字母、数字、下划线
[^abc] 除abc \s 所有空白字符(换行符,空格)
[0-9a-zA-z] 0到9的数字,小写的a到z,大写的A-Z \S 所有非空白字符
\d 数字 . 除换行符之外的任意字符
\D 非数字

多个规范也可以称之为一组规范

上述规范中大写字母一般就是小写字母的取反。

在Java中一个\用\\表示

\\
对于\\来说,第一个\是转义符。

栗子:利用正则表达式规范一个3位的纯数字。

栗子:

    public static void main(String[] args) {
        String txt = "asdas11121456481qwe889788978asd1asd156";//待验证字符串

        Pattern compile = Pattern.compile("\\d\\d\\d");//想要实例化Pattern类,必须调用compile()方法
        //Pattern compile = Pattern.compile("[0-9][0-9][0-9]");等价于上行代码
        Matcher matcher = compile.matcher(txt);
        while (matcher.find()){
            System.out.println(matcher.group());
        }
        System.out.println("验证整个字符串是否符合正则规范"+matcher.matches());
    }

程序运行结果:

111
214
564
//81只有两位,并不匹配
889
788
978
156
验证整个字符串是否符合正则规范false

对于整个字符串来说,肯定是不符合题目要求的三个纯数字规范的。

(书写规范会导致PatternSyntaxException异常)

正则规范限定符

用于指定限定符自身之前的规范出现的次数。
(X,Y表示一个或一组规范,,一组规范用小括号()包括)

规范限定符 限定符描述 实例 实例的描述
X 必须出现一个 a a必须出现一次
X? 可以出现0次或1次 abc? c可以出现0次或1次
X+ 可以出现1次或多次(至少出现一次) (abc)+ abc至少出现一次
X* 可以出现0次、1次或多次(可以出现任意次) m* m可以出现任意次
X{n} 必须出现n次 m{3} 必须出现3个m
X{n,} 必须出现n次以上 m{3,} 必须出现3个m以上
X{n,m} 必须出现n到m次 m{3,4} 必须出现3个m到4个m
X|Y a|b a或b必须出现一次
Java默认是贪婪匹配,对于a{2,3}。总是会匹配3个m,也就是会匹配尽可能多的字符。

(贪婪匹配也叫贪心匹配)

当?字符紧跟其他限定符之后,就是非贪婪匹配。总是会匹配尽可能短的字符。

a{2,3}?,会尽可能匹配2个a

栗子:使用非贪婪匹配解析字符串"aaaa"

栗子:

    public static void main(String[] args) {
        String txt = "aaaa";

        Pattern compile = Pattern.compile("a{2,3}?");//尽可能匹配2个a
        Matcher matcher = compile.matcher(txt);
        while (matcher.find()){
            System.out.println(matcher.group());
        }
    }

程序运行结果:

aa
aa
//非贪婪匹配会尽可能匹配2个a。所以aaaa会被解析成两个aa

正则规范定位符

用于规范字符出现的位置。

规范定位符	定位符描述	实例		实例的描述
^		开头		^[0-9]+		必须以数字开头并至少有一个数字
$		结尾		^\d+a$		必须以数字开头并至少有一个数字,且必须是a结尾

栗子:利用定位符与限定符解析字符串"1961-a123sdg11dashj_"。

栗子:

    public static void main(String[] args) {
        String txt = "1961-a123sdg11dashj_";

        Pattern compile = Pattern.compile("^\\d{4}\\-\\w*$");
        Matcher matcher = compile.matcher(txt);
        if (matcher.find()){
            System.out.println("匹配");
        }else {
            System.out.println("不匹配");
        }
    }

程序运行结果:

匹配

解析:
image

注意!!正则表达式一种题目,肯定拥有多种不同的写法,切忌吊死在一棵树上!!
注意!!正则表达式一种题目,肯定拥有多种不同的写法,切忌吊死在一棵树上!!
注意!!正则表达式一种题目,肯定拥有多种不同的写法,切忌吊死在一棵树上!!

分组规范

在一组规范中,可以再次细分组,使用小括号包括。称之为分组规范

"^[0-9]+194-[abcdf]"	这种可以称之为一组规范

在上述一组规范基础上,可以再次细分。
"^[0-9]+(194-)([abcdf])"

194- 称之为第一组
[abcdf] 称之为第二组

栗子:利用分组规范解析字符串"15as4das6d86asfas54d6sad65sa556as4d5sad4a6s5"
解析出 (\d\d)(\w\d)这种的模式的字符
并依次打印第一组,第二组字符

栗子:

    public static void main(String[] args) {
        String txt = "15as4das6d86asfas54d6sad65sa556as4d5sad4a6s5";

        Pattern compile = Pattern.compile("(\\d\\d)(\\w\\d)");
        Matcher matcher = compile.matcher(txt);
        while (matcher.find()) {
            System.out.println(matcher.group(0));//得到整体符合规范的字符串
            System.out.println(matcher.group(1));//得到整体符合规范的字符串的第一组规范
            System.out.println(matcher.group(2));//得到整体符合规范的字符串的第二组规范
            System.out.println(matcher.group(3));//得到整体符合规范的字符串的第三组规范,没有 报错
        }
    }

程序运行结果:

54d6
54
d6
Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 3
	at java.util.regex.Matcher.group(Matcher.java:538)
	at module3.Test26.main(Test26.java:16)

注意,正则并没有书写错误,所以并没有出现PatternSyntaxException异常。

反向引用

在规范中引用规范。称之为反向引用。

(X)\\1
X是一个或一组规范,\\1表示引用第一组规范。

栗子:利用反向引用解析出字符串"asd1221a4s8d7asd199144878844568455222"
中 nmmn这种模式的数字。

栗子:

    public static void main(String[] args) {
        String txt = "asd1221a4s8d7asd199144878844568455222";

        Pattern compile = Pattern.compile("(\\d)(\\d)\\2\\1");
        Matcher matcher = compile.matcher(txt);
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }

程序运行结果:

1221
1991

利用正则结巴去重案例,非常精彩,有兴趣可以看看韩顺平-正则结巴去重

String对正则的支持

String类中有3个方法支持正则操作:

方法 类型 描述
public boolean matches(String regex) 普通方法 字符串匹配
public String replaceAll(String regex, String replacement) 普通方法 字符串替换
public String[] split(String regex) 普通方法 字符串拆分

更多java.util.regex包下的方法请自行查找jdk api 1.8,一定要学会看api文档!!

标签:Java,String,正则表达式,matcher,规范,第十七,compile,Pattern,字符串
From: https://www.cnblogs.com/Ocraft/p/17876155.html

相关文章

  • Java基础故障处理工具
    适用场景:生产环境由于可视化工具侵入系统,带来资源占用、安全问题或者规模较小未部署可视化监控平台,此时要使用基础命令行工具;给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括但不限于异常堆栈、虚拟机运行日志、垃圾......
  • java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1
    java.lang.IllegalStateException:ExpectedBEGIN_OBJECTbutwasSTRINGatline1column2path$packagecom.example.core.mydemo.scooterOrderSms;importcom.alibaba.fastjson.JSON;importcom.example.core.mydemo.json2.GsonUtils;importcom.google.gson.Gso......
  • 应用报错:java.lang.OutOfMemoryError: unable to create new native thread
    上个月生产环境忽然出现部分交易处理缓慢甚至超时,查看对应应用日志发现一直在刷报错日志,报错信息如下java.lang.OutOfMemoryError:unabletocreatenewnativethread从报错上来看是说不能创建本地线程了,应用都是容器部署的,开始我怀疑是容器内存不够了导致内存泄露,但经过查看容器......
  • Day19 Java 流程控制01:用户交互Scanner
    Java流程控制01:用户交互ScannerScanner对象之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类:Scanner类,可以通过它来获取用户的输入基本语法:Scannerscanner=newScanner(System.in);通过Scanner类的next()与nextLine()方......
  • Java 内存分析工具 Arthas 介绍与示例讲解
    目录一、概述二、Arthas安装三、Arthas主要组成结构四、Arthas通信主要流程五、Arthas快速入门讲解1)启动Arthas2)基础命令介绍3)jvm相关1、dashboard(实时数据面板)2、Thread(线程相关堆栈信息)3、jvm(查看当前JVM的信息)4、memory(查看JVM的内存信息)5、sysprop(查看/修改属性)6、s......
  • LeetCode-Java:55.跳跃游戏
    题目给你一个非负整数数组nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回true;否则,返回false。示例1:输入:nums=[2,3,1,1,4]输出:true解释:可以先跳1步,从下标0到达下标1,然后......
  • 黑马java基础简记
    day02——数据类型、运算符需要我们注意的是,随便写一个整数或者小数的字面量,它也是有默认数据类型的-比如23,它默认就为int类型;如果加上后缀L,则为long类型;-比如23.8,它默认为double类型;如果加上后缀F,则为float类型; //如果希望随便写一个整型字面量是long类型的,需要在其后......
  • Java学习之路(十二)
    Java学习之路(十二)1、时间日期类1.1、Date类(应用)计算机中时间原点1970年1月1日00:00:00时间换算单位1秒=1000毫秒Date类概述Date代表了一个特定的时间,精确到毫秒Date类构造方法方法名说明publicDate()分配一个Date对象,并初始化,以便它代表它被分......
  • Java变量
     1.Java命名规则包名:全部小写,多单词.隔开aaa.bbb.ccccom.baidu.类名和接口:每个单词首字母大写大驼峰AaaBbbCcc变量名函数名小驼峰:换单词大写aaaBbbCccnextInt(){}左括号前不换行变量声明格式:数据类型变量名=初始值;=1.表示赋值,将右边的内容存入到左边......
  • 一个关于swing实时翻译的java文件
    首先是我的架构,分别是启动,百度api接口的调用文件,swing的界面设计文件 其中的依赖是酱紫的(自己敲)<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.9</version>......