正则表达式基础语法

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);
  1. 避免过度使用.通配符,尽可能明确匹配范围
  2. 对于简单固定字符串匹配,优先使用String.contains()或String.startsWith()等原生方法
  3. 谨慎使用回溯量大的表达式(如嵌套的量词)

Java中使用正则表达式的正确打开方式的更多相关文章

  1. InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式

    InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式 https://mp.weixin.qq.com/s/HGa_90XvC22anabiBF8AbQ 在这篇文章里,我将讨论在MySQL 5 ...

  2. 学术Essay写作中Introduction的正确打开方式

    其实在学术essay写作过程中,很多留学生经常不知道如何写introduction,所以有些开头的模板句就出现了,比如,With the development of society/With the ...

  3. (转)Java中使用正则表达式的一个简单例子及常用正则分享

    转自:http://www.jb51.net/article/67724.htm 这篇文章主要介绍了Java中使用正则表达式的一个简单例子及常用正则分享,本文用一个验证Email的例子讲解JAVA中如 ...

  4. iOS开发小技巧--相机相册的正确打开方式

    iOS相机相册的正确打开方式- UIImagePickerController 通过指定sourceType来实现打开相册还是相机 UIImagePickerControllerSourceTypeP ...

  5. 9.JAVA中的正则表达式

    一.JAVA中的正则表达式 1.概念:以某种特定的方式描述字符串 1.Java中正则表达式的规则 ?          #{0,1}-?有一个-或者没有 \\           #表示一个" ...

  6. Xcode 的正确打开方式——Debugging(转载)

    Xcode 的正确打开方式——Debugging   程序员日常开发中有大量时间都会花费在 debug 上,从事 iOS 开发不可避免地需要使用 Xcode.这篇博客就主要介绍了 Xcode 中几种能 ...

  7. C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别

    C#语法——泛型的多种应用   本篇文章主要介绍泛型的应用. 泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性.类型安全性和效率. 泛型的定义 下面定义了 ...

  8. Console控制台的正确打开方式

    Console控制台的正确打开方式 console对象提供了访问浏览器调试模式的信息到控制台 -- Console对象 |-- assert() 如果第一个参数断言为false,则在控制台输出错误信息 ...

  9. 任务队列和异步接口的正确打开方式(.NET Core版本)

    任务队列和异步接口的正确打开方式 什么是异步接口? Asynchronous Operations Certain types of operations might require processi ...

  10. 译:Java 中的正则表达式性能概述

    原文链接:https://www.baeldung.com/java-regex-performance 作者: baeldung 译者:Darren Luo 1. 概述 在本快速教程中,我们将展示模 ...

随机推荐

  1. AI大模型应用开发入门-LangChain实现文档总结

    一.整体思路 长网页文本往往超过 LLM 单次处理的 token 限制,我们需要设计一个 map-reduce 流水线来拆分.局部总结.归并: 加载网页内容 拆分成可控大小的 chunk 对每个 ch ...

  2. HyperWorks练习:使用Batch Mesher 批量划分网格

    通过此前章节的学习,我们已经对基于 Batch Mesher 的复杂模型几何清理及网格剖分技术的基本原理和方法有了初步的了解.在这一节,我们将通过一个具体的实例,向用户演示如何使用这一强有力的几何清理 ...

  3. Altair官方文档——HyperMesh模型管理

    1.4 模型管理 在HyperMesh中创建一个有效的求解输入文件时,模型管理功能是非常必要的.本节将介绍基本的模型管理方法,如单元和载荷归类.集合组装.重命名.删除.排序以及重新编号等. 本节将学习 ...

  4. thinkphp ,php5.3以上版本,开发调式工具 ,基于nodejs 的socketlog

    源码官方网站 https://github.com/luofei614/SocketLog

  5. vue 学习视频推荐 & 初始化项目流程

    简介 vue 有些名词听着很牛逼 vue-路由 啥的就是 标签的不再刷新的版本.其实选一个比较好的入门的视频挺好的. bilibili link https://www.bilibili.com/vi ...

  6. 离线环境下的AI模型部署实战:基于Xinference搭建嵌入、重排与语音处理平台

    1. 引言:为什么选择离线部署 在当今AI技术快速发展的时代,许多企业面临着数据安全与合规性的严格要求,特别是在金融.医疗和政府等领域,离线部署AI模型成为刚需.本文将详细介绍如何利用Xinferen ...

  7. ZYNQ -linux 上电设置默认静态IP地址

    在linux终端系统中,我们经常需要通过SSH等远程登录的方式对板卡进行调试,因此需要板卡上电后就设置一个静态IP地址. 下面给出方法: 在根文件系统目录下: 找到 /etc/network/inte ...

  8. SciTech-BigDataAIML-paperswithcode.com-Datasets+Method+Code: 这网站上有丰富的"数据集"+Papers论文+Code代码实现

    https://paperswithcode.com/ 这网站上有丰富的"数据集"+Papers论文+Code代码实现

  9. SciTech-AV-Audio-DAP(Digital Audio Processing)-Loudness Normalization(响度规范化): Perceived Loudness + RMS (Root Mean Square)

    EBU: European Broadcasting Union Loudness Normalization Use the Loudness Normalization to change the ...

  10. SciTech-Mathematics-Probability+Statistics-Comparison:Chance + Possibility + Likelihood + Probability

    https://www.geeksforgeeks.org/what-is-the-difference-between-likelihood-and-probability/ 1. Chance 2 ...