正则表达式基础语法

Java正则表达式基于java.util.regex包,核心类是PatternMatcher。基本语法遵循标准正则规范:

  • . 匹配任意单个字符(除换行符)
  • \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-

性能优化建议

  1. 预编译常用正则表达式:
private static final Pattern EMAIL_PATTERN = Pattern.compile(emailRegex);
  1. 避免过度使用.通配符,尽可能明确匹配范围

  2. 对于简单固定字符串匹配,优先使用String.contains()String.startsWith()等原生方法

  3. 谨慎使用回溯量大的表达式(如嵌套的量词)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95200.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95200.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95200.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker中Mysql容器忽略大小写

场景说明 在数据迁移场景中,从一个数据库中将数据迁移到另一个数据,经常会遇到,两个不同数据库之间,一个默认忽略大小写,一个默认不忽略大小写,导致实际业务层服务进行数据库访问时,切换数据库之…

神经网络激活函数:从ReLU到前沿SwiGLU

摘要 本文全面介绍了神经网络中常用的激活函数,包括Sigmoid、Tanh、ReLU等传统函数,以及2017年后出现的Swish、Mish、SwiGLU等新兴函数。每个函数均提供数学定义、优缺点分析、Python实现代码和可视化图像,并附有实际应用建议和性能对比数据,帮助读者根据具体任务选择合适…

线程池常见面试问答

好嘞 &#x1f44d;&#xff0c;我帮你把这些 线程池 并发编程八股文 整理成 问答对照表&#xff08;Q & A&#xff09;&#xff0c;你面试时可以直接用。&#x1f9fe; 线程池常见面试问答一、基础语法 & STLQ1&#xff1a;std::function<void()> 和函数指针的…

Flutter 开发技巧 AI 快速构建 json_annotation model 的提示词

将下面这段复制到AI GPT、DeepSeek 、文心快码 试过效果都可以&#xff0c;不用做任何更改。将 json 数据丢给 AI 就行了 我会提供一段 JSON 数据&#xff0c;请帮我生成 Dart 模型&#xff0c;要求严格如下&#xff1a;1. 使用 json_annotation 包&#xff0c;包含&#xff1a…

【秋招笔试】2025.08.30科大讯飞秋招笔试题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围在线刷题 bishipass.com 科大讯飞 题目一:物品种类统计 1️⃣:使用集合或哈希表统计不同物品编号的数量 2️⃣:利用数学公式 n - 不同种类数 计算最终答案 难度:简单 这道题目的关…

AI 智能体汇总,自动执行任务的“真 Agent”

AI Agent 正在掀起一场静默的效率革命&#xff1a;当 AI 遇上 RPA&#xff0c;真正的“数字员工”时代已经到来最近一段时间&#xff0c;我密集关注了多场 AI Agent&#xff08;智能体&#xff09;的发布会&#xff0c;覆盖了从消费级到企业级的各类产品。一个越来越清晰的趋势…

vue布局

给于2个div块状元素的布局方案1&#xff1a;横向并排&#xff08;Flex Row&#xff09;<template><div class"container"><div class"background">背景</div><div class"panel">内容</div></div> <…

Hysplit大气传输和污染扩散-轨迹聚合标准20%30%用途

1、HYSPLIT轨迹聚合中的百分比标准在HYSPLIT模型中&#xff0c;轨迹聚合&#xff08;Trajectory Clustering&#xff09;用于将大量轨迹按相似性分组&#xff0c;20%和30%是常见的聚合阈值标准&#xff0c;反映轨迹间的空间相似度要求。2、20%和30%的具体含义这两个百分比代表轨…

Linux shell 脚本基础 003

目录 Linux shell 脚本语句 1. for 循环流程控制 1.1 基本语法格式 1.2 常见用法示例 1.3生产案例示例 2. while 循环 2.1 基本语法格式 2.2 常见用法示例 3. case 语句 3.1 基本语法格式 3.2 常见用法示例 3.3生产案例示例 4. shell 函数 4.1 函数的定义 4.2 函…

7.1elementplus的表单

Element Plus 表单由以下几个关键部分构成&#xff1a;<el-form>: 表单容器。它是整个表单的根组件&#xff0c;负责管理表单数据、校验规则、布局方式等。<el-form-item>: 表单项容器。用于包裹一个具体的表单控件&#xff08;如输入框、选择器等&#xff09;及其…

TF-IDF:文本分析的“火眼金睛”

TF-IDF&#xff1a;文本分析的“火眼金睛” 在信息爆炸的时代&#xff0c;我们每天都会接触到海量的文本数据。如何从这些数据中快速找出最重要的信息&#xff1f;TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;算法就是一种非常实用的工具&#xf…

传统星型拓扑结构的5G,WiFi无线通信网络与替代拓扑结构自组网

一、个人理解 区别自组网&#xff0c;5G和WiFi三者要抓住两个关键点&#xff1a;移动、组网。 5G通信是移动通信的最新一代&#xff1b;1940年代美军的手持对讲机虽然可以移动&#xff0c;但是算不上网络&#xff0c;后面的第一代移动通信蜂窝网络才能算上网络。 WiFi通信虽…

REST API 是无状态的吗,如何保障 API 的安全调用?

当然&#xff0c;这是一个非常核心的API设计和安全领域的问题。我们来详细拆解一下。1. REST API 是无状态的吗&#xff1f;​是的&#xff0c;REST API 的核心原则之一就是“无状态”&#xff08;Statelessness&#xff09;。​​这意味着&#xff1a;​服务器不保存客户端的会…

Machine Learning HW3 report:图像分类(Hongyi Lee)

任务&#xff1a;使用CNN把食物图片分为11类&#xff08;不能使用预训练的模型&#xff09;。此任务很耗时&#xff0c;一次训练至少1h&#xff0c;所以要利用好Kaggle notebook中Save Version功能&#xff0c;并行训练节省时间。 基准 Simple : 0.50099Medium : 0.73207 Train…

Element整体操作样式

Element: 给表格整体设置斑马纹 在main.js中 ElementUI.Table.props.stripe {type: Boolean,default: true }在element-ui.scss中 // // 为所有 el-table 设置默认斑马纹 // .el-table { // &.el-table--enable-row-hover .el-table__body tr:hover > td { // ba…

谷歌官宣组建“网络攻击部门”,美国网络安全战略转向“以攻代防”

谷歌宣布将组建网络攻击部门8月27日&#xff0c;谷歌宣布将组建网络攻击部门&#xff08;disruption unit&#xff09;。谷歌威胁情报集团副总裁Sandra Joyce在本周二的网络安全政策会议上表示&#xff0c;谷歌正在寻找“合法且符合道德规范的干扰方案”&#xff0c;通过情报主…

Rust Tokio异步任务实战教程(高级功能)

1. 强大的异步 I/O 多路复用Tokio 的核心竞争力之一是对操作系统原生异步 I/O 机制的封装&#xff08;如 Linux 的 epoll、Windows 的 IOCP、macOS 的 kqueue&#xff09;&#xff0c;这是异步非阻塞的底层基石。作用&#xff1a;允许单线程同时监听成百上千个 I/O 事件&#x…

8.1【Q】VMware相关

在图四中&#xff0c;Interface Layer是用来干什么的&#xff1f;IOBus是什么我正在使用VMware虚拟机&#xff0c;但是没有网络&#xff08;宿主机有网&#xff09;&#xff0c;我该如何配置网络&#xff1f;网络连接模式​​&#xff1a;​​NAT模式​​&#xff08;推荐&…

从卡顿到丝滑:大型前端项目 CSS 优化全攻略

摘要 页面样式变重是大前端项目常见的后遗症&#xff1a;CSS 体积越来越大、首屏卡、切页抖、首包飙。核心问题其实就三件事&#xff1a;把首屏必须的样式尽快给到浏览器、把非首屏的样式晚点再说、把多余的样式坚决清理掉。本文用可运行的 Demo 和工程化流程&#xff0c;带你…

CSS基础学习第二天

1.emmet语法1&#xff09;快速生成HTML结构语法---标签名tab键即可生成标签---标签*数量即可生成多个标签---如果有父子级关系的标签&#xff0c;用>&#xff0c;比如ul>litab键---如果有兄弟级的标签&#xff0c;用tab键---如果生成带有类名或者id名字的&#xff0c;直接…