Java中使用正则表达式的正确打开方式
正则表达式基础语法
Java正则表达式基于java.util.regex包,核心类是Pattern和Matcher。基本语法遵循标准正则规范:
- . 匹配任意单个字符(除换行符)
- \d 匹配数字,等价于 [0-9]
- \w 匹配单词字符,等价于 [a-zA-Z0-9_]
- \s 匹配空白字符(空格、制表符等)
- [] 字符集合,如 [abc] 匹配a、b或c
- ^ 在字符集中表示否定,如 [^abc] 匹配非a/b/c的字符
- * 匹配前一个元素0次或多次
- + 匹配前一个元素1次或多次
- ? 匹配前一个元素0次或1次
- {n} 精确匹配n次
- {n,} 匹配至少n次
- {n,m} 匹配n到m次
- | 写在方括号外面,表示或
- && 交集,表示与
- (?!) 忽略后面字符的大小写
常用预定义字符类
\\d 数字 [0-9]
\\D 非数字 [^0-9]
\\s 空白字符 [ \\t\\n\\x0B\\f\\r]
\\S 非空白字符 [^\\s]
\\w 单词字符 [a-zA-Z_0-9]
\\W 非单词字符 [^\\w]
边界匹配符
^ 匹配行首
$ 匹配行尾
\b 匹配单词边界
\B 匹配非单词边界
Java中的特殊处理
在Java字符串中需要使用双反斜杠转义:
// 匹配数字的正则表达式
String regex = "\\d+"; // 实际表示 \d+
Pattern和Matcher使用示例
import java.util.regex.*;
String text = "Hello 123 World";
// Pattern:表示正则表达式
Pattern pattern = Pattern.compile("\\d+");
// Matcher:文本匹配器,从头开始读取,直到读取到匹配的字符串
Matcher matcher = pattern.matcher(text);
// 查找匹配
while (matcher.find()) {
System.out.println("Found: " + matcher.group());
}
// 匹配整个字符串
boolean isMatch = Pattern.matches("Hello.*", text);
- 贪婪爬取:用+,*,表示尽可能多的获取数据
- 非贪婪爬取:在+,*后面加上?,表示尽可能少的获取数据
String str = "aaaaaaaaaabbbbbbbbaaaaaaaaa";
System.out.println("--------- 贪婪匹配 ---------");
// 贪婪匹配
Pattern p = Pattern.compile("ab+");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group());
}
System.out.println("--------- 懒惰匹配 ---------");
// 懒惰匹配
Pattern p1 = Pattern.compile("ab+?");
Matcher m1 = p1.matcher(str);
while (m1.find()) {
System.out.println(m1.group());
}
效果图:
分组和捕获
使用()创建捕获组:
String str = "a123a";
String str1 = "abc123abc";
String str2 = "1117891111";
String str3 = "aa7879a";
// 捕获分组
System.out.println("--------- 捕获分组 ---------");
String regex = "(.).+\\1";
String regex1 = "(.+).+\\1";
String regex2 = "((.)\\2).+\\1";
System.out.println(str.matches(regex));
System.out.println(str1.matches(regex1));
System.out.println(str2.matches(regex2));
System.out.println(str3.matches(regex2));
// 非捕获分组
System.out.println("--------- 非捕获分组 ---------");
String str4 = "我要学学变变变变撑撑撑撑撑";
str4 = str4.replaceAll("(.)\\1+", "$1");// replaceAll() 方法用于把所有满足匹配的字符串替换成指定的字符串
System.out.println(str4);
效果图:
- 从1开始,连续不断
- 以左括号为基准
- 捕获分组(默认):① 内部:\组号 ② 外部:$组号(组号会保留下来)
- 非捕获分组:使用条件,不占组号
- "?=":表示任一数据
- "?:":表示所有数据
- "?!":表示不包含这些数据
常用正则表达式示例
- 邮箱验证:
String emailRegex = "^[\\w-_.+]*[\\w-_.]@([\\w]+\\.)+[\\w]+[\\w]$";
- 手机号验证(中国大陆):
String phoneRegex = "^1[3-9]\\d{9}$";
- 身份证号验证(简易版):
String idCardRegex = "^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$";
- URL验证:
String urlRegex = "^(https?://)?([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$";
特殊匹配模式
通过Pattern的常量设置匹配模式:
// 不区分大小写匹配
Pattern.CASE_INSENSITIVE
// 多行模式(^和$匹配每行的开头和结尾)
Pattern.MULTILINE
// 示例:不区分大小写匹配
Pattern.compile("hello", Pattern.CASE_INSENSITIVE).matcher("Hello").find(); // true
字符串替换
使用正则表达式进行字符串替换:
String text = "a1b2c3";
String replaced = text.replaceAll("\\d", "-"); // a-b-c-
性能优化建议
预编译常用正则表达式:
private static final Pattern EMAIL_PATTERN = Pattern.compile(emailRegex);
- 避免过度使用.通配符,尽可能明确匹配范围
- 对于简单固定字符串匹配,优先使用String.contains()或String.startsWith()等原生方法
- 谨慎使用回溯量大的表达式(如嵌套的量词)
Java中使用正则表达式的正确打开方式的更多相关文章
- InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式
InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式 https://mp.weixin.qq.com/s/HGa_90XvC22anabiBF8AbQ 在这篇文章里,我将讨论在MySQL 5 ...
- 学术Essay写作中Introduction的正确打开方式
其实在学术essay写作过程中,很多留学生经常不知道如何写introduction,所以有些开头的模板句就出现了,比如,With the development of society/With the ...
- (转)Java中使用正则表达式的一个简单例子及常用正则分享
转自:http://www.jb51.net/article/67724.htm 这篇文章主要介绍了Java中使用正则表达式的一个简单例子及常用正则分享,本文用一个验证Email的例子讲解JAVA中如 ...
- iOS开发小技巧--相机相册的正确打开方式
iOS相机相册的正确打开方式- UIImagePickerController 通过指定sourceType来实现打开相册还是相机 UIImagePickerControllerSourceTypeP ...
- 9.JAVA中的正则表达式
一.JAVA中的正则表达式 1.概念:以某种特定的方式描述字符串 1.Java中正则表达式的规则 ? #{0,1}-?有一个-或者没有 \\ #表示一个" ...
- Xcode 的正确打开方式——Debugging(转载)
Xcode 的正确打开方式——Debugging 程序员日常开发中有大量时间都会花费在 debug 上,从事 iOS 开发不可避免地需要使用 Xcode.这篇博客就主要介绍了 Xcode 中几种能 ...
- C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别
C#语法——泛型的多种应用 本篇文章主要介绍泛型的应用. 泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性.类型安全性和效率. 泛型的定义 下面定义了 ...
- Console控制台的正确打开方式
Console控制台的正确打开方式 console对象提供了访问浏览器调试模式的信息到控制台 -- Console对象 |-- assert() 如果第一个参数断言为false,则在控制台输出错误信息 ...
- 任务队列和异步接口的正确打开方式(.NET Core版本)
任务队列和异步接口的正确打开方式 什么是异步接口? Asynchronous Operations Certain types of operations might require processi ...
- 译:Java 中的正则表达式性能概述
原文链接:https://www.baeldung.com/java-regex-performance 作者: baeldung 译者:Darren Luo 1. 概述 在本快速教程中,我们将展示模 ...
随机推荐
- DRF之过滤类源码分析
DRF之过滤类源码分析 [一]过滤类介绍及BaseFilterBackend Django REST framework(DRF)中的过滤类允许你在API视图中对查询进行过滤,以根据特定条件筛选结果集 ...
- VisualStudio2022制作多项目的解决方案模板
VisualStudio 2022 本身只提供了,一个项目生成模版,并没有多个项目一起打包生成模版,不过,可以使用nuget 跟dotnet来打包整个解决方案 第一步 如果没有nuget这个工具的话可 ...
- 内网环境下Go module的包管理和包拉取解决方案
前言 很多开发的小伙伴在工作中经常会遇到需要在内网环境下开发生产,因此就必须要解决内网环境下Go语言的包管理和包拉取问题.恰逢我现在公司就需要在内网环境下开发新项目,因此在此记录我们内网环境下Go m ...
- C# 去掉字符串中的html 标签,保留指定的标签和属性
/// <summary> /// 使用示例 /// </summary> public static void HtmlRemove() { string requestBo ...
- Python库积累之Selenium(一)-Seleniun基础
Selenium是一个用电脑模拟人操作浏览器网页,支持多平台,多浏览器和多种编程语言,广泛应用于自动化,测试,爬虫等场景中. 官方文档:https://www.selenium.dev/seleniu ...
- sass 定义全局变量
定义变量文件 随便写一个scss文件,比如在 src/assets/var.scss $my-color: #00b96b; 打包工具配置 不同工具 如webpack.vite有不同的处理方式加载到全 ...
- CMake 实践 小结
网上已经有很多的CMake的总结也好博客也好. 全当个人的记录.如果有错误务必留言. what is CMake? 一般来说就是一个自动生成makefile的工具.--脚本语言. why learn ...
- API管理平台,可视化统一管理企业API
API管理平台是为开发.产品.测试人员提供接口管理服务,帮助开发者更好地管理API接口,轻松实现创建.发布.维护API. 企业数字化转型为何需要用到API管理平台? 随着企业的不断发展,各类型的业务系 ...
- I2C协议背景知识简介与FTDI的FT4232H配成USB to I2C(MPSSE)使用实例
MPSSE Application Example: http://ftdichip.cn/Support/SoftwareExamples/MPSSE.htm MPSSE: AN_129 FTDI ...
- SciTech-AV-Audio-Music-Theory: Dance + 身体使用 汇编 + 乐理及声乐感知 pitch +tempo + form + beat + timbre + percussive + rhythmic + harmonic + texture
Dance + 身体使用 汇编 特别注意: 心神: 轻松.专注.聚精会神. 大脑: 珍惜爱护"脑力",不可"过度用脑"."德智体美劳"全面发 ...