【java 正则表达式 笔记】

文章目录

快速入门

简单的说:正则表达式是对字符串执行模式匹配的技术。

正则表达式:regular expression=>RegExp

匹配中文或数字或大小写字母(一个或多个)

java 复制代码
String content = "abc12ABC34231esdfsABCdsadd想问ABC下我下午";
// 创建Pattern对象,模式对象
Pattern pattern = Pattern.compile("([\\u4e00-\\u9fff]+)|([0-9]+)|([a-zA-Z]+)");
// 创建匹配器对象
//理解:就是matcher匹配器按照 pattern(模式/样式),到content文本中去匹配
// 找到就返回true,否则就返回false
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
    // 匹配内容、文本,放到 m.group(0)
    System.out.println(matcher.group(0));
}

输出

正则表达式底层实现(重要)

mather.find() 完成的任务

考虑分组

mather.group(0) 分析

1.根据groups[0]=0和groups[1]=4的记录的位置,从content开始截取子字符串返回

就是[0,4) 包含0但是不包含索引为4的位置

如果再次指向find方法,仍然按上面分析来执行

//1小结

//1.如果正则表达式有()即分组

//2.取出匹配的字符串规则如下

//3. group(0)表示匹配到的子字符串

//4. group(1)表示匹配到的子字符串的第1组字串

//5. group(2)表示匹配到的子字符串的第2组字串

//16. ... 但是分组的数不能越界

正则表达式基本语法

元字符

转义字符

在Java的正则表达式中,两个\代表其他语

言中的一个\

区分大小写

java正则表达式默认是区分字母大小写的,如何实现不区分大小写

限定字符

细节:java匹配默认贪婪匹配,即尽可能匹配多的

选择匹配符

特殊字符

字符匹配符

定位符

分组、捕获和反向引用

1.分组

我们可以用圆括号组成一个比较复杂的匹配模式,那么一个圆括号的部分我们可

以看作是一个子表达式/一个分组。

2.捕获

把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显式命名

的组里,方便后面引用,从左向右,以分组的左括号为标志,第一个出现的分组

的组号为1,第二个为2,以此类推。组0代表的是整个正则式

3.反向引用

圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹

配模式,这个我们称为反向引用,这种引用既可以是在正则表达式内部,也可以是

在正则表达式外部,内部反向引用分组号,外部反向引用$分组号

捕获

特别分组

反向引用

经典结巴程序
java 复制代码
String content = "我...我要...学学学学...编程java";
// 去掉所有的.
Pattern pattern = Pattern.compile("\\.");
Matcher matcher = pattern.matcher(content);
content = matcher.replaceAll("");
System.out.println(content);

//String regExp = "([\\u4e00-\\u9fff])\\1+([\\u4e00-\\u9fff])\\2?([\\u4e00-\\u9fff])\\3+([\\u4e00-\\u9fff]+)+(\\w+)";

//        pattern = Pattern.compile("(.)\\1+");
//        matcher = pattern.matcher(content);
//        while (matcher.find()) {
//            System.out.println("找到=" + matcher.group());
//        }
//        // 使用 反向引用$1 来替换匹配到的内容
//        content = matcher.replaceAll("$1");
//        System.out.println(content);

// 使用一条语句 去掉重复的字
content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");
System.out.println(content);

三个常用类

java.util.regex包主要包括以下三个类Pattern类、Matcher类和PatternSyntaxException

Pattern类

pattern对象是一个正则表达式对象。Pattern类没有公共构造方法。要创建一个Pattern对

象,调用其公共静态方法,它返回一个Pattern对象。该方法接受一个正则表达式作为它的第

一个参数,比如:Pattern r=Pattern.compile(pattern);

Matcher类

Matcher对象是对输入字符串进行解释和匹配的引擎。与Pattern类一样,Matcher也没有

公共构造方法。你需要调用Pattern对象的matcher方法来获得一个Matcher对象

PatternSyntaxException

PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

Pattern

常用方法

matches 整体匹配

用于整体匹配,在验证输入的字符串是否满足条件使用

Matcher

常用方法

替换

PatternSyntaxException

应用实例

匹配汉字、邮政编码、qq号码、手机号

java 复制代码
String content = "韩顺平教育";
content = "13588889999";
// 汉字
//String regExp = "^[\u0391-\uffe5]+$";

// 邮政编码
// 要求:是1-9开头的六位数
//String regExp = "^[1-9]\\d{5}$";

// qq号码
// 要求:1-9开头的一个(5位数-10位数)
//String regExp = "^[1-9]\\d{4,9}$";

// 手机号码
// 要求:必须以13,14,15,18 开头的11位数,比如  13588889999
String regExp = "^1[3|4|5|8]\\d{9}$";
Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(content);
if(matcher.find()) {
System.out.println(matcher.group(0));
}

匹配url

java 复制代码
String content = "https://www.bilibili.com/video/BV1fh411y7R8?p=894&vd_source=c12af894764c0594ed08999165cda06a";
String regExp = "^((http|https)://)?([\\w-]+\\.)+[\\w-]+(/[\\w-?=&/%.#]*)?$";
Pattern compile = Pattern.compile(regExp);
Matcher matcher = compile.matcher(content);
if (matcher.find()) {
    System.out.println(matcher.group());
}

对url进行解析

java 复制代码
String url = "https://www.google.com:8080/abc/index.html";
String regExp = "^(https?)?(?:://)?(\\w+\\.\\w+\\.?\\w*\\.?\\w+)+(?::(\\d{2,5}))?(?:/\\w+/)?(\\w+\\.[a-zA-Z]+)?$";
Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(url);
if (matcher.matches()) {
    System.out.println("协议:" +matcher.group(1));
    System.out.println("域名:" +matcher.group(2));
    System.out.println("端口:" +matcher.group(3));
    System.out.println("文件名:" +matcher.group(4));
} else {
    System.out.println("匹配失败");
}

String中使用正则表达式

替换

验证手机号

分割匹配

验证是不是整数或者小数

分割匹配

验证是不是整数或者小数

相关推荐
星河梦瑾2 分钟前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
黄名富5 分钟前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
love静思冥想7 分钟前
JMeter 使用详解
java·jmeter
言、雲9 分钟前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
TT哇16 分钟前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
Yvemil71 小时前
《开启微服务之旅:Spring Boot 从入门到实践》(三)
java
Anna。。1 小时前
Java入门2-idea 第五章:IO流(java.io包中)
java·开发语言·intellij-idea
.生产的驴1 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
爱上语文1 小时前
宠物管理系统:Dao层
java·开发语言·宠物
Hejjon1 小时前
SpringBoot 整合 SQLite 数据库
笔记