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

news2025/3/24 4:12:15

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

正则表达式(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.coloradmin.cn/o/2319913.html

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

相关文章

20250318在ubuntu20.04中安装向日葵

rootrootrootroot-X99-Turbo:~$ sudo dpkg -i SunloginClient_15.2.0.63064_amd64.deb rootrootrootroot-X99-Turbo:~$ sudo apt-get install -f rootrootrootroot-X99-Turbo:~$ sudo dpkg -i SunloginClient_15.2.0.63064_amd64.deb 20250318在ubuntu20.04中安装向日葵 2025/3…

如何记录Matlab程序运行过程中所占用的最大内存(续)

在上一篇博客中&#xff0c;我们讨论了如何记录Matlab程序运行过程中所占用的最大内存。 博客原文&#xff1a;如何记录Matlab程序运行过程中所占用的最大内存-CSDN博客 但经过测试发现&#xff0c;这与实际有非常大的差异。运行如下例子&#xff1a; clear;clc; profile on…

自动驾驶背后的数学:多模态传感器融合的简单建模

上一篇博客自动驾驶背后的数学:特征提取中的线性变换与非线性激活 以单个传感器为例,讲解了特征提取中的线性变换与非线性激活。 这一篇将以多模态传感器融合为例,讲解稍复杂的线性变换和非线性激活应用场景。 (一)权重矩阵的张量积分解 y = W x + b = [ w 11 ⋯ w 1 n ⋮…

12 File文件对象:创建、获取基本信息、遍历文件夹、查找文件;字符集的编解码 (黑马Java视频笔记)

文章目录 File >> 存储数据的方案1. 认识File2. File操作2.1 创建File对象2.2 File操作1&#xff09;对文件对象的信息的操作2&#xff09;文件/文件夹的创建/删除3&#xff09;⭐⭐对文件夹的遍历 3. 方法递归3.1 认识递归3.2 递归算法及其执行流程1) 案例&#xff1a;2…

HTML应用指南:利用GET请求获取猫眼电影日票房信息——以哪吒2为例

2025年春节档期&#xff0c;国产动画电影《哪吒之魔童闹海》&#xff08;以下简称《哪吒2》&#xff09;以颠覆性的叙事风格与工业化制作水准震撼登场&#xff0c;不仅刷新了中国动画电影的票房纪录&#xff0c;更成为全球影史现象级作品。影片凭借春节档期的爆发式开局、持续5…

荣耀手机卸载应用商店、快应用中心等系统自带的

1.下载abd ADB Download - Get the latest version of ADB and fastboot 2.手机打开开发者选项 3.手机接电脑打开USB调试 4.下载MT管理器查看系统包名 D:\1.LFD\ADB\platform-tools-latest-windows\platform-tools>adb shell adb.exe: no devices/emulators found 这边是…

苍穹外卖学习笔记

整体概述 1).用户层 本项目中在构建系统管理后台的前端页面&#xff0c;我们会用到H5、Vue.js、ElementUI、apache echarts(展示图表)等技术。而在构建移动端应用时&#xff0c;我们会使用到微信小程序 2).网关层 Nginx是一个服务器&#xff0c;主要用来作为Http服务器&…

每日一题力扣2974.最小数字游戏c++

2974. 最小数字游戏 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> numberGame(vector<int>& nums) {vector<int> arr(nums.size());sort(nums.begin(),nums.end());for(size_t i0;i<nums.size();i2){arr[i]nums[i1]…

软考中级-软件设计师 准备

软考中级-软件设计师 准备 一、软考相关1.1、考试时间1.2、考试时长1.3、题型和分值&#xff1a; 二、软考备考2.1、相关书籍2.2、推荐课程&#xff1a;B站up主zst_20012.3、学习路线 一、软考相关 1.1、考试时间 一年有两次软考&#xff0c;一般是五月末和十一月的中旬 以下…

EasyRTC嵌入式音视频通信SDK:WebRTC技术下的硬件与软件协同演进,开启通信新时代

在当今数字化时代&#xff0c;智能设备的普及和人们对实时通信需求的不断增长&#xff0c;推动了嵌入式音视频通信技术的快速发。EasyRTC嵌入式音视频通信SDK凭借其独特的技术特点和应用优势&#xff0c;在嵌入式设备和多平台实时通信领域脱颖而出。 1、轻量级设计与高性能 Ea…

Lineageos 22.1(Android 15)实现负一屏

一、前言 方案是参考的这位大佬的&#xff0c;大家可以去付费订阅支持一波。我大概理一下Android15的修改。 大佬的方案代码 二、Android15适配调整 1.bp调整&#xff0c;加入aidl引入&#xff0c;这样make之后就可以索引代码了 filegroup {name: "launcher-src"…

《深度学习》——YOLOv3详解

文章目录 YOLOv3简介YOLOv3核心原理YOLOv3改进YOLOv3网络结构 YOLOv3简介 YOLOv3&#xff08;You Only Look Once, version 3&#xff09;是一种先进的实时目标检测算法&#xff0c;由 Joseph Redmon 和 Ali Farhadi 开发。它在目标检测领域表现出色&#xff0c;具有速度快、精…

【设计模式】三十一、状态模式

系列文章|源码 https://github.com/tyronczt/design-mode-learn 文章目录 系列文章|源码一、模式核心思想二、模式结构三、Java代码示例&#xff1a;订单状态管理1. 定义状态接口2. 实现具体状态类3. 上下文类&#xff08;Context&#xff09;4. 客户端调用5. 运行截图 四、状…

vue 获取当前时间并自动刷新

新增需求&#xff0c;需要在大屏的右上角展示当前时间&#xff0c;并实时按秒刷新&#xff0c;通过通义千问搜索关键js代码后&#xff0c;整理出如下代码。 【效果图】 【HTML】 <div class"time-wrap">{{ formattedDateTime }}<span> {{ weekTime }}&…

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

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

WebDeveloper靶机详解

一、主机发现 arp-scan -l靶机ip为192.168.55.163 二、端口扫描、目录枚举、漏洞扫描、指纹识别 2.1端口扫描 nmap --min-rate 10000 -p- 192.168.55.163发现并无特殊端口开放 扫描一下UDP端口 nmap -sU --min-rate 10000 -p- 192.168.55.163没有扫描到UDP端口 2.2目录枚…

来源于胡椒的亚甲二氧桥CYP450-文献精读119

Piper nigrum CYP719A37 Catalyzes the Decisive Methylenedioxy Bridge Formation in Piperine Biosynthesis 胡椒 (Piper nigrum) CYP719A37 催化胡椒碱生物合成中关键的亚甲二氧桥形成 摘要 胡椒 (Piper nigrum) 是世界上最受欢迎的香料之一。其主要辛辣成分胡椒碱 (piper…

梦回杭州...

她对我说&#xff0c;烟雨中的西湖更别有情趣&#xff0c;我也怀着对‘人间天堂’的憧憬踏上了向往之旅。第一次亲密接触没有感觉中那么好&#xff0c;现在想起来是那时的人和心情都没能安静下来&#xff0c;去慢慢品味它的美。 六下杭州&#xff0c;亲历每一片风景&#xff0c…

NAT 实验:多私网环境下 NAPT、Easy IP 配置及 FTP 服务公网映射

NAT基本概念 定义&#xff1a;网络地址转换&#xff08;Network Address Translation&#xff0c;NAT&#xff09;是一种将私有&#xff08;保留&#xff09;地址转化为合法公网 IP 地址的转换技术&#xff0c;它被广泛应用于各种类型 Internet 接入方式和各种类型的网络中。作…

YOLO数据集分割训练集、测试集和验证集

记录一下自己的分割代码。 注意&#xff1a; 这是在windows环境&#xff0c;请Linux的同学们注意。标签为txt&#xff0c;图像为jpg&#xff0c;其他的我没试过喔。 训练集、验证集、测试集&#xff08;7:2:1&#xff09; import os import shutil import random from tqdm…