正则表达式

正则表达式教程


1. 什么是正则表达式?

正则表达式(Regular Expression,简称 Regex)是一种用于匹配、查找或替换文本中特定模式的工具。它通过定义一组规则来描述字符串的格式,广泛应用于文本处理、数据验证、日志分析等领域。

示例

  • 匹配邮箱地址:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • 匹配手机号:^1[3-9]\d{9}$

2. 正则表达式基础语法

2.1 字符匹配

符号说明示例匹配结果
.匹配任意单个字符(除换行符)a.cabc, aXc
\d匹配数字(0-9)\d{3}123, 456
\w匹配字母、数字或下划线\w+hello, a1_
\s匹配空白字符(空格、制表符等)\s+ , \t
[abc]匹配括号内的任意一个字符[aeiou]a, e, i
[^abc]匹配在括号内的字符[^0-9]a, B, _
[a-z]匹配范围内的字符[A-Z]A, B, Z

2.2 量词(控制匹配次数)

符号说明示例匹配结果
*匹配前一个字符 0 次或多次ab*cac, abc, abbc
+匹配前一个字符 1 次或多次ab+cabc, abbc
?匹配前一个字符 0 次或 1 次ab?cac, abc
{n}匹配前一个字符恰好 n 次a{3}aaa
{n,}匹配前一个字符至少 n 次a{2,}aa, aaa
{n,m}匹配前一个字符 n 到 m 次a{1,3}a, aa, aaa

2.3 边界匹配

符号说明示例匹配结果
^匹配字符串开头^HelloHello world
$匹配字符串结尾world$Hello world
\b匹配单词边界\bcat\bcat, a cat
\B匹配非单词边界\Bcat\Bcategory

2.4 分组与引用

符号说明示例匹配结果
(abc)分组并捕获匹配内容(ab)+abab
(?:abc)分组但不捕获(非捕获组)(?:ab)+abab
\1, \2引用前面的分组(反向引用)(\d)\111, 22

2.5 逻辑运算符

符号说明示例匹配结果
``或(匹配左边或右边)`cat
&&逻辑与(部分语言支持)--

3. 进阶技巧

3.1 贪婪与非贪婪匹配

  • 贪婪模式(默认):尽可能多地匹配字符。
    • 示例:a.+b 匹配 aabab → 结果为 aabab
  • 非贪婪模式(加 ?):尽可能少地匹配字符。
    • 示例:a.+?b 匹配 aabab → 结果为 aab

3.2 零宽断言

  • 正向先行断言 (?=...):匹配后面必须跟的内容。
    • 示例:\d+(?=px) 匹配 100px 中的 100
  • 负向先行断言 (?!...):匹配后面不能跟的内容。
    • 示例:\d+(?!px) 匹配 100pt 中的 100
  • 正向后行断言 (?<=...):匹配前面必须有的内容。
    • 示例:(?<=\$)\d+ 匹配 $100 中的 100
  • 负向后行断言 (?<!...):匹配前面不能有的内容。
    • 示例:(?<!\$)\d+ 匹配 100(非 $100)。

3.3 条件匹配

  • 语法:(?(条件)真分支|假分支)
    • 示例:(?(?=\d)\d+|[a-z]+) 匹配数字或字母。

3.4 递归匹配

  • 部分语言支持递归(如 PCRE),用于匹配嵌套结构。
    • 示例:((\((?>[^()]+|(?1))*\))) 匹配嵌套括号。

4. 实际应用场景

4.1 数据验证

  • 邮箱地址
    ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
    
  • URL
    ^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$
    

4.2 文本提取

  • 提取 HTML 标签内容
    <([a-z]+)[^>]*>(.*?)<\/\1>
    
  • 提取日志中的 IP 地址
    \b(?:\d{1,3}\.){3}\d{1,3}\b
    

4.3 文本替换

  • 将日期格式从 YYYY-MM-DD 改为 DD/MM/YYYY
    • 查找:(\d{4})-(\d{2})-(\d{2})
    • 替换:$3/$2/$1

4.4 字符串分割

  • 按逗号分割字符串
    ,\s*
    

5. 常见工具与语言支持

工具/语言正则表达式引擎特点
Notepad++PCRE支持递归、条件匹配
Pythonre 模块简单易用,支持非贪婪匹配
JavaScriptRegExp浏览器原生支持
PerlPCRE正则表达式“鼻祖”
Javajava.util.regex严格模式,需转义字符

6. 学习资源推荐

  1. 在线测试工具
  2. 书籍
    • 《精通正则表达式》(Jeffrey Friedl)
  3. 文档

7. 常见问题

  1. 为什么我的正则表达式不匹配?
    • 检查是否开启多行模式(^$ 的行为)。
    • 确认是否转义特殊字符(如 *\*)。
  2. 如何匹配跨行内容?
    • 使用 [\s\S] 代替 .(如 <<[\s\S]*?>>)。
  3. 如何提高正则表达式性能?
    • 避免过度嵌套和回溯,优先使用具体匹配。

总结:正则表达式是文本处理的瑞士军刀,掌握它能大幅提升效率。建议从简单场景入手,逐步学习进阶语法,并通过在线工具实践调试!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值