正则表达式:文本处理的瑞士军刀

正则表达式:文本处理的瑞士军刀

正则表达式(Regular Expression,简称 Regex)是一种用于匹配、查找和操作文本的强大工具。它通过定义一种特殊的字符串模式,可以快速地在文本中搜索、替换或提取符合特定规则的内容。正则表达式广泛应用于编程、文本编辑、数据处理等领域,是每个开发者必备的技能之一。


一、正则表达式的核心概念

1. 模式(Pattern)

正则表达式的核心是一个模式字符串,它定义了需要匹配的文本规则。例如:

  • \d 匹配任意数字(0-9)
  • [a-z] 匹配任意小写字母
  • .* 匹配任意字符(除换行符外)

2. 匹配(Match)

在目标文本中查找符合模式的内容。例如:

  • 正则表达式 \d{3} 可以匹配文本中的任意连续3个数字(如 “123”)。

3. 捕获组(Capture Group)

用括号 () 将部分模式括起来,可以提取匹配的子内容。例如:

  • 正则表达式 (\d{4})-(\d{2})-(\d{2}) 可以匹配日期格式 “2023-10-05”,并分别捕获年、月、日。

二、正则表达式的语法规则

1. 基本元字符

元字符描述示例
.匹配任意单个字符(除换行符外)a.c 匹配 “abc”
\d匹配任意数字(0-9)\d{3} 匹配 “123”
\w匹配字母、数字或下划线\w+ 匹配 “hello_123”
\s匹配空白字符(空格、制表符等)\s+ 匹配 " "

2. 量词

量词描述示例
*匹配前一个元素0次或多次a* 匹配 “”、“a”、“aa”
+匹配前一个元素1次或多次\d+ 匹配 “1”、“123”
?匹配前一个元素0次或1次a? 匹配 “”、“a”
{n}匹配前一个元素恰好n次\d{3} 匹配 “123”
{n,m}匹配前一个元素至少n次,至多m次\d{2,4} 匹配 “12”、“1234”

3. 字符类

语法描述示例
[abc]匹配括号内的任意一个字符[aeiou] 匹配 “a”、“e”
[^abc]匹配不在括号内的任意字符[^0-9] 匹配 “a”、“!”
[a-z]匹配范围内的任意字符[A-Za-z] 匹配大写或小写字母

4. 边界匹配

语法描述示例
^匹配字符串的开头^Hello 匹配 “Hello world” 的开头
$匹配字符串的结尾world$ 匹配 “Hello world” 的结尾
\b匹配单词边界\bcat\b 匹配 “cat” 但不匹配 “category”

三、正则表达式的应用场景

1. 数据验证

  • 验证邮箱格式:
    ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
    
  • 验证手机号格式:
    ^1[3-9]\d{9}$
    

2. 文本搜索与替换

  • 查找所有日期:
    \d{4}-\d{2}-\d{2}
    
  • 替换HTML标签:
    <[^>]+>
    

3. 数据提取

  • 提取URL中的域名:
    https?://([^/\s]+)
    
  • 提取文本中的所有数字:
    \d+
    

四、正则表达式的编程实现(C++示例)

C++11 引入了 <regex> 库,支持正则表达式操作。以下是一个简单的示例:

#include <iostream>
#include <regex>
#include <string>int main() {std::string text = "Contact us at support@example.com or sales@domain.com.";std::regex emailPattern(R"(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b)");auto words_begin = std::sregex_iterator(text.begin(), text.end(), emailPattern);auto words_end = std::sregex_iterator();std::cout << "Found emails:\n";for (std::sregex_iterator i = words_begin; i != words_end; ++i) {std::smatch match = *i;std::cout << match.str() << '\n';}return 0;
}

输出

Found emails:
support@example.com
sales@domain.com

五、正则表达式的性能优化

1. 避免贪婪匹配

  • 贪婪匹配(默认):
    <.*>
    
    匹配整个 <div>content</div>
  • 非贪婪匹配:
    <.*?>
    
    匹配 <div></div> 两个标签。

2. 预编译正则表达式

在多次使用同一正则表达式时,预编译可以显著提高性能:

std::regex emailPattern(R"(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b)");

3. 使用非捕获组

如果不需要捕获组的内容,使用 (?:...) 可以提高性能:

(?:\d{4})-(?:\d{2})-(?:\d{2})

六、正则表达式的学习资源

  1. 在线测试工具

    • Regex101
    • RegExr
  2. 经典书籍

    • 《精通正则表达式》(Jeffrey E.F. Friedl)
    • 《正则表达式必知必会》
  3. 练习平台

    • LeetCode 正则表达式题目
    • HackerRank Regex Challenges

正则表达式是文本处理的利器,但也需要谨慎使用。掌握其核心语法和优化技巧,可以让你在数据处理中事半功倍!

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

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

相关文章

SQL 中UPDATE 和 DELETE 语句的深入理解与应用

在 SQL 中&#xff0c;UPDATE和DELETE语句是用于操作表数据的重要工具&#xff0c;它们允许我们对已存在的数据进行修改和删除。 一、UPDATE 语句 &#xff08;一&#xff09;基本语法 UPDATE语句的基本语法如下&#xff1a; UPDATE table_name SET column1 value1, colum…

C 语 言 --- 扫 雷 游 戏(初 阶 版)

C 语 言 --- 扫 雷 游 戏 初 阶 版 代 码 全 貌 与 功 能 介 绍扫雷游戏的功能说明游 戏 效 果 展 示游 戏 代 码 详 解game.htest.cgame.c 总结 &#x1f4bb;作 者 简 介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验 助 你 入 门 C 语 言 &#x1f4a1;个 人 主…

车载以太网网络测试-21【传输层-DOIP协议-4】

目录 1 摘要2 DoIP entity status request/response&#xff08;0x4001、0x4002&#xff09;2.1 使用场景2.2 报文结构2.2.1 0x4001&#xff1a;DoIP entity status request2.2.2 0x4002&#xff1a;DoIP entity status response 3 Diagnostic power mode information request/…

CH347使用笔记:CH347结合STM32CubeIDE实现单片机下载与调试

目录 基于 STM32CubeIDE的 CH347 JTAG/SWD调试器使用说明1. CH347驱动安装与配置2. STM32CubeIDE调试器配置2.1 打开相关工程后&#xff0c;进行以下操作2.2 openocd.exe替换2.3 脚本添加2.4 更改调试器选择 3. 下载程序4. 使用过程中可能遇到的问题4.1 CH347未插入4.2 Openocd…

LVGL常用功能备忘

概述 本文选用LVGL 8.3版本 8.3版本实测帧率比起9版本高,多个GUI工具支持 相关链接 LVGL官网 https://lvgl.io/ LVGL 文档 https://docs.lvgl.io/8.3/ LVGL仓库 https://github.com/lvgl LVGL移植 获取源码 https://github.com/lvgl/lvgl/tree/release/v8.3 下载文件即可 文件…

k8s搭建kube-prometheus

后续再补一个k8s集群搭建的博客&#xff0c;从0开始搭建k8s集群。使用kube-prometheus非常方便&#xff0c;主要问题只在于拉取镜像。除了拉取镜像外其他时间5分钟即可。耐心等待拉取镜像。 一.kube-prometheus简介 kube-prometheus 是一个专为 Kubernetes 设计的开源监控解决…

uni-app——数据缓存API

数据缓存API 在 uni-app 开发中&#xff0c;数据缓存 API 起着重要作用&#xff0c;它能够将需要的数据保存到本地&#xff0c;同时也提供了获取本地缓存数据、移除缓存数据以及清理缓存数据的功能。在实际项目里&#xff0c;数据缓存 API 常被用于存储会员登录状态信息、购物…

突破时空边界:Java实时流处理中窗口操作与时间语义的深度重构

一、流处理范式的革命性演进 在数字化浪潮的推动下&#xff0c;数据处理范式正经历着从批量到实时的根本性转变。这种转变不仅改变了数据处理的时效性特征&#xff0c;更重新定义了时间维度在计算模型中的战略地位。Apache Flink的统计数据显示&#xff0c;现代流处理系统每秒…

【2025 深圳大学-腾讯云程序设计竞赛(热身赛)】题解

比赛链接 A. Cloud Studio的共享连接 题目大意 && Solution 给定 T T T 组长度均为 12 12 12 的字符串 s s s。 对每个 s s s&#xff0c;将其按从左到右的顺序两两分组形成 6 6 6 个 A S C I I \rm{ASCII} ASCII 码&#xff0c;对这 6 6 6 个 A S C I I \…

APScheduler - 用户指南

本文翻译整理自&#xff1a;https://apscheduler.readthedocs.io/en/3.x/userguide.html 文章目录 一、安装 APScheduler二、代码示例三、基本概念四、选择合适的 scheduler, job store(s), executor(s) and trigger(s)五、配置调度器方法 1:方法 2:方法 3: 六、启动调度器七、…

vue3:十一、主页面布局(优化页面跳转方式)

:router"true" 一、参考文章 vue3:十一、主页面布局(实现基本左侧菜单右侧内容效果)-CSDN博客 参考上述文章可知&#xff0c;页面跳转是通过在js中定义的菜单中携带的path&#xff0c;然后通过菜单的点击事件完成的跳转&#xff0c;现在可以进行优化&#xff0c;直…

每日一题--C与C++的差别

C与C的差别 1. 编程范式 C 纯 过程式编程语言&#xff0c;强调函数和结构化编程。 代码通过函数和顺序步骤组织&#xff0c;适合底层系统开发。 C 支持 多范式编程&#xff1a; 过程式编程 面向对象编程&#xff08;OOP&#xff09;&#xff08;类、继承、多态&#xff09; …

Etcd 服务搭建

&#x1f4a2;欢迎来到张胤尘的开源技术站 &#x1f4a5;开源如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Etcd 服务搭建预编译的二进制文件安装下载 etcd 的…

玩转C#函数:参数、返回值与游戏中的攻击逻辑封装

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

WebRTC建立Description的通信的实际的原理

一、正确流程的核心逻辑 // 发送端正确代码示例 const senderPC new RTCPeerConnection();// 生成Offer时立即开始收集候选 ✅ senderPC.createOffer().then(offer > {await senderPC.setLocalDescription(offer); // 触发icecandidate事件sendToReceiver(offer); });// …

EmbodiedSAM:在线实时3D实例分割,利用视觉基础模型实现高效场景理解

2025-02-12&#xff0c;由清华大学和南洋理工大学的研究团队开发 一种名为 EmbodiedSAM&#xff08;ESAM&#xff09;的在线3D实例分割框架。该框架利用2D视觉基础模型辅助实时3D场景理解&#xff0c;解决了高质量3D数据稀缺的难题&#xff0c;为机器人导航、操作等任务提供了高…

信创-人大金仓数据库创建

一. 官文 资源下载地址 https://download.kingbase.com.cn/xzzx/index.htm 下载安装文件 下载授权文件 产品文档地址&#xff1a;https://help.kingbase.com.cn/v8/index.html 二. 概念 2.1 体系结构 ‌ 实例结构 ‌&#xff1a;由数据库文件和 KingbaseES 实例组成。数据…

C++第三种异质集合 std::any方式实现

#include <type_traits> #include <any> #include <functional> #include <iomanip> #include <iostream> #include <typeindex> #include <typeinfo> #include <unordered_map> #include <vector> //any是编译期的异质…

Springboot实现使用断点续传优化同步导入Excel

springboot实现使用断点续传优化同步导入Excel 需求前言断点续传前端实现后端实现完结撒花&#xff0c;如有需要收藏的看官&#xff0c;顺便也用发财的小手点点赞哈&#xff0c;如有错漏&#xff0c;也欢迎各位在评论区评论&#xff01; 需求前言 在跨境电商系统中&#xff0c…

mysql 对json的处理?

MySQL从5.7版本开始支持JSON数据类型&#xff0c;并提供了多种函数来查询和处理JSON数据。以下是一些基本的操作和函数&#xff1a; 创建包含JSON列的表&#xff1a; 可以直接在表定义中指定某列为JSON类型。 CREATE TABLE my_table (id INT NOT NULL AUTO_INCREMENT,data JSON…