当前位置: 首页 > news >正文

正则表达式(Regular Expression)详解

正则表达式(简称"regex"或"regexp")是一种强大的文本模式匹配工具,它使用特定语法来描述、匹配和操作字符串。

基本概念

正则表达式是由普通字符(如字母a到z)和特殊字符(称为"元字符")组成的文本模式。这个模式描述在搜索文本时要匹配的一个或多个字符串。

主要用途

  1. 验证:检查字符串是否符合特定模式(如邮箱、电话号码格式)
  2. 搜索:在文本中查找特定模式的字符串
  3. 替换:将匹配的文本替换为其他内容
  4. 提取:从字符串中提取特定部分

基本语法

常见元字符

元字符说明
.匹配任意单个字符(除换行符外)
^匹配字符串的开始位置
$匹配字符串的结束位置
*匹配前面的子表达式零次或多次
+匹配前面的子表达式一次或多次
?匹配前面的子表达式零次或一次
\d匹配一个数字字符,等价于[0-9]
\w匹配字母、数字或下划线,等价于[A-Za-z0-9_]
\s匹配任何空白字符(空格、制表符、换行符等)
[abc]匹配a、b或c中的任意一个字符
[^abc]匹配任何不在a、b或c中的字符
{n}匹配恰好n次
{n,}匹配至少n次
{n,m}匹配至少n次,最多m次

示例

  1. 匹配手机号(中国大陆):

    ^1[3-9]\d{9}$
    
    • ^:字符串开始
    • 1:数字1开头
    • [3-9]:第二位是3-9中的一个数字
    • \d{9}:后面跟着9个数字
    • $:字符串结束
  2. 匹配邮箱

    ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
    
  3. 匹配日期(YYYY-MM-DD格式):

    ^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$
    

在不同语言中的使用

JavaScript

// 创建正则表达式
const regex = /pattern/flags;  // 字面量形式
const regex = new RegExp("pattern", "flags");  // 构造函数形式// 使用示例
const phoneRegex = /^1[3-9]\d{9}$/;
console.log(phoneRegex.test("13812345678")); // trueconst match = "Hello 123".match(/\d+/);
console.log(match[0]); // "123"

Python

import re# 匹配
phone_pattern = r'^1[3-9]\d{9}$'
if re.match(phone_pattern, "13812345678"):print("Valid phone number")# 查找所有匹配
numbers = re.findall(r'\d+', 'abc123def456')
print(numbers)  # ['123', '456']

Java

import java.util.regex.*;Pattern pattern = Pattern.compile("^1[3-9]\\d{9}$");
Matcher matcher = pattern.matcher("13812345678");
boolean isMatch = matcher.matches(); // true

进阶概念

  1. 分组:使用()捕获分组

    ^(\d{3})-(\d{3,8})$  // 匹配区号-电话号码
    
  2. 非贪婪匹配:在*+后加?实现最小匹配

    <.*?>  // 匹配HTML标签(非贪婪模式)
    
  3. 先行断言

    • (?=pattern) 正向先行断言
    • (?!pattern) 负向先行断言
  4. 修饰符

    • i 不区分大小写
    • g 全局匹配
    • m 多行模式

学习建议

  1. 从简单模式开始练习
  2. 使用在线工具(如regex101.com)测试你的正则表达式
  3. 记住常见模式(如邮箱、URL、电话号码等)
  4. 注意不同语言中正则表达式实现的细微差异

正则表达式虽然学习曲线较陡,但一旦掌握,可以极大地提高文本处理的效率和能力。

相关文章:

  • 配置VS的DLL文件引用目录(两种方案,无需每次生成dll后手动将其复制到exe目录下)
  • 表面等离子共振技术(SPR)在小分子与蛋白质相互作用研究中的应用
  • MyBatis 动态 SQL 完整笔记
  • 世界少棒联盟(Little League Baseball)·棒球1号位
  • 【LangChain基础系列】深入全面掌握文本分类
  • C——VS的调试技巧
  • 更多 QVariant 使用案例
  • Python序列Day3
  • 如何对 Oracle 日志文件进行校验
  • 钯铂贵金属分离回收树脂
  • Nginx 配置多个监听端口
  • obj = null; 赋值null之前没有其他引用指向obj对象,那么,当obj=null时,会被垃圾回收机制立即回收吗?
  • 编程题 02-线性结构2 一元多项式的乘法与加法运算【PAT】
  • PostgreSQL 的 pg_current_logfile 函数
  • 【Ubuntu】Netplan静态网络配置
  • 缺乏实体人形机器人的主流高精度仿真方案
  • Flutter接入ProtoBuff和原生Android通信【性能最优】
  • tmux 入门与实用指南
  • 39、.NET GC是什么? 为什么需要GC?
  • 深泽多层电路在PCB行业中属于什么水平
  • 市自规局公告收回新校区建设用地,宿迁学院:需变更建设主体
  • 明明睡够了,怎么还有黑眼圈?可能是身体在求救
  • 特色业务多点开花,苏州银行擦亮金融为民底色
  • 上海优化营商环境十大攻坚突破任务中,为何第一项是实施世行对标改革?
  • 中国驻美国大使馆发言人就中美经贸高层会谈答记者问
  • 央行行长:债券市场“科技板”准备工作基本就绪,目前近百家市场机构计划发行超三千亿科技创新债