正则表达式

一、正则表达式基础语法

1. 普通字符与元字符

  • 普通字符:直接匹配字面值(如 a 匹配字符 a)。
  • 元字符:具有特殊含义,需转义使用(如 \d 匹配数字,\w 匹配字母、数字、下划线)。
    • 边界匹配符:
      ^(字符串开头)、$(字符串结尾)、\b(单词边界,如 java\b 匹配独立单词 java)。
    • 点号 .:匹配除换行符外的任意字符(默认),配合 s 修饰符可匹配换行符。

2. 预定义字符集

元字符 匹配内容 示例
\d 数字(等价于 [0-9] \d+ 匹配连续数字
\D 非数字(等价于 [^0-9] \D* 匹配非数字序列
\w 单词字符(字母、数字、下划线) \w{3,} 匹配3-15位用户名
\s 空白字符(空格、制表符等) \s+ 匹配连续空格

3. 量词

  • *:匹配0次或多次(如 a* 匹配空字符串或多个 a)。
  • +:匹配1次或多次(如 a+ 至少匹配一个 a)。
  • ?:匹配0次或1次(如 a? 可选 a)。
  • {n,m}:匹配n到m次(如 \d{3,5} 匹配3-5位数字)。

二、正则表达式核心功能

  1. 验证字符串
    通过模式匹配检查输入合法性,如邮箱、电话号码格式。

    python 复制代码
    import re
    pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
    re.match(pattern, "user@example.com")  # 验证邮箱
  2. 查找与替换

    • findall():返回所有匹配项(如提取文本中的数字)。
    • sub():替换匹配内容(如将逗号替换为分号)。
    python 复制代码
    text = "Date: 2023-04-15, Time: 14:30"
    date_time = re.search(r"Date: (\d{4}-\d{2}-\d{2}), Time: (\d{2}:\d{2})", text)
    print(date_time.groups())  # 输出 ('2023-04-15', '14:30')
  3. 分组与捕获
    使用 () 分组,提取特定部分(如从URL中提取路径)。

    python 复制代码
    url = "https://example.com/path/to/page"
    match = re.match(r"https://(.*)/(\w+)", url)
    print(match.group(1))  # 输出 example.com/path/to
    print(match.group(2))  # 输出 page

三、修饰符与高级特性

  1. 常用修饰符
    • i:忽略大小写(如 Aa 均匹配)。
    • g:全局匹配(返回所有匹配项)。
    • m:多行模式(^$ 匹配每行的开头和结尾)。
    • s:点号匹配换行符。
  2. 非贪婪匹配
    添加 ? 实现最小匹配(如 a.*?b 匹配 a...b 中最短的部分)。

四、应用场景示例

  1. 数据提取
    从日志中提取时间戳:

    python 复制代码
    text = "2023-04-15T14:30:00 Error: Invalid input"
    date = re.search(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}", text).group()
  2. 文本格式化
    自动替换标点符号:

    python 复制代码
    text = "Hello, World! 你好,世界!"
    new_text = re.sub(r"[,!]}", " ", text)  # 输出 "Hello  World  你好  世界!"
  3. 网页数据抓取
    提取HTML中的链接:

    python 复制代码
    html = "Link"
    links = re.findall(r"href='([^']*)'", html)  # 输出 ['https://example.com']

五、常见问题与优化

  1. 转义字符
    元字符(如 .*)需转义为 \.\*
  2. 性能优化
    • 避免过度使用 .*,优先使用精确匹配(如 \d{4} 代替 .*)。
    • 预编译正则表达式(如 re.compile(pattern))提升多次调用效率。

六、总结

正则表达式是处理文本数据的高效工具,适用于验证、查找、替换和提取等场景。掌握其核心语法(元字符、量词、分组)和修饰符(ig)可显著提升开发效率。实际应用中需注意转义规则和性能优化,结合具体语言的库(如Python的 re 模块)实现功能。

相关推荐
草莓熊Lotso10 分钟前
Linux 文件描述符与重定向实战:从原理到 minishell 实现
android·linux·运维·服务器·数据库·c++·人工智能
大模型玩家七七14 分钟前
基于语义切分 vs 基于结构切分的实际差异
java·开发语言·数据库·安全·batch
岳麓丹枫0011 小时前
PostgreSQL 中 pg_wal 目录里的 .ready .done .history 文件的生命周期
数据库·postgresql
寻星探路5 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
陌上丨7 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
曹牧7 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
AI_56788 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
执笔论英雄8 小时前
【大模型学习cuda】入们第一个例子-向量和
学习
ccecw8 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql