Administrator
发布于 2025-08-28 / 13 阅读
2
0

正则表达式完全指南:从认识到精通

什么是正则表达式?

正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于描述字符串模式的特殊语法。它就像文本处理的"超级搜索"工具,可以让你用简单的模式匹配复杂的文本结构。

为什么学习正则表达式?

  • 高效文本处理:快速验证、搜索和提取数据

  • 代码简化:一行正则可能替代数十行普通代码

  • 跨平台通用:几乎所有编程语言都支持正则表达式

  • 强大灵活:处理复杂的文本匹配需求

基础语法入门

1. 字面值字符

最简单的正则就是普通字符:

hello   匹配 "hello"
test    匹配 "test"
123     匹配 "123"

2. 元字符(特殊字符)

字符

含义

示例

匹配结果

.

匹配任意单个字符

a.c

"abc", "aac", "a1c"

^

匹配字符串开始

^Hello

"Hello world" ✓ "Say Hello" ✗

$

匹配字符串结束

world$

"Hello world" ✓ "world peace" ✗

*

前字符0次或多次

ab*c

"ac", "abc", "abbc"

+

前字符1次或多次

ab+c

"abc", "abbc" ✓ "ac" ✗

?

前字符0次或1次

colou?r

"color", "colour"

\

转义字符

\.

匹配实际的点号"."

\|

或操作

cat\|dog

"cat" 或 "dog"

3. 字符类

模式

含义

等价写法

示例

[abc]

匹配a、b或c

-

[aeiou] 匹配任何元音

[a-z]

匹配a到z任意字母

-

[a-z] 匹配小写字母

[^abc]

匹配a、b、c的字符

-

[^0-9] 匹配非数字字符

\d

数字字符

[0-9]

\d+ 匹配一个或多个数字

\D

非数字字符

[^0-9]

\D+ 匹配非数字字符

\w

单词字符

[a-zA-Z0-9_]

\w+ 匹配单词

\W

非单词字符

[^\w]

匹配标点符号等

\s

空白字符

[ \t\n\r\f\v]

匹配空格、制表符等

\S

非空白字符

[^\s]

匹配非空白字符

4. 量词

量词

含义

示例

{n}

精确匹配n次

a{3} 匹配 "aaa"

{n,}

匹配至少n次

a{2,} 匹配 "aa", "aaa", ...

{n,m}

匹配n到m次

a{2,4} 匹配 "aa", "aaa", "aaaa"

5. 分组和捕获

模式

含义

示例

( )

创建捕获组

(abc)+ 匹配 "abc", "abcabc"

(?: )

非捕获分组

(?:abc)\d 匹配 "abc1"但不捕获"abc"

|

或操作符

(jpg|png|gif) 匹配图片扩展名

常用正则表达式示例

1. 邮箱验证

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • ^ 字符串开始

  • [a-zA-Z0-9._%+-]+ 用户名部分

  • @ 必须的@符号

  • [a-zA-Z0-9.-]+ 域名部分

  • \. 转义的点号

  • [a-zA-Z]{2,}$ 顶级域名(2个以上字母)

2. 手机号验证(中国大陆)

^1[3-9]\d{9}$
  • ^1 以1开头

  • [3-9] 第二位是3-9

  • \d{9}$ 后面9位数字

3. URL匹配

https?://[^\s/$.?#].[^\s]*
  • https? http 或 https

  • :// 协议分隔符

  • [^\s/$.?#] 域名开始字符

  • [^\s]* 后续路径字符

4. 日期格式(YYYY-MM-DD)

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

5. 密码强度验证(至少8位,含大小写和数字)

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$
  • (?=.*[a-z]) 正向预查,必须包含小写字母

  • (?=.*[A-Z]) 必须包含大写字母

  • (?=.*\d) 必须包含数字

  • .{8,} 至少8个字符

在各语言中使用正则

JavaScript

// 创建正则表达式
const regex = /pattern/flags;  // 字面量形式
const regex2 = new RegExp('pattern', 'flags');  // 构造函数形式
​
// 常用方法
const str = "Hello World";
const match = str.match(/world/i);  // 匹配,i flag忽略大小写
const replaced = str.replace(/hello/i, "Hi");  // 替换
const test = /world/i.test(str);  // 测试是否匹配

Python

import re
​
text = "Hello World"
pattern = r"world"  # raw string
​
# 常用方法
match = re.search(pattern, text, re.IGNORECASE)
matches = re.findall(pattern, text, re.I)
replaced = re.sub(pattern, "Python", text, flags=re.I)

Java

import java.util.regex.*;
​
String text = "Hello World";
Pattern pattern = Pattern.compile("world", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(text);
​
if (matcher.find()) {
    System.out.println("找到匹配: " + matcher.group());
}

正则表达式标志(Flags)

标志

含义

示例

i

忽略大小写

/hello/i 匹配 "hello", "Hello", "HELLO"

g

全局匹配

匹配所有出现,而不只是第一个

m

多行模式

^$匹配每行的开始和结束

s

单行模式

.匹配包括换行符在内的所有字符

实用技巧和最佳实践

1. 测试工具推荐

  • 在线测试:Regex101、RegExr

  • 桌面工具:RegexBuddy、VS Code搜索功能

2. 性能优化建议

// 不好:过度使用.*
.*abc.*
​
// 好:更具体的匹配
[^abc]*abc[^abc]*
​
// 不好:贪婪匹配
<.*>
​
// 好:非贪婪匹配
<.*?>

3. 调试技巧

  • 从简单开始,逐步复杂化

  • 使用在线测试工具实时验证

  • 添加注释(某些支持注释的正则引擎)

(?x)  # 启用注释模式
^     # 字符串开始
\d{3} # 3位数字
-     # 连字符
\d{2} # 2位数字
$     # 字符串结束

4. 常见陷阱

  • 贪婪匹配:默认是贪婪的,使用?转为非贪婪

  • 转义特殊字符:记得转义 . * + ? () [] {}

  • 性能问题:避免嵌套量词和回溯爆炸

练习题目

  1. 匹配HTML标签<([a-z]+)([^<]+)*(?:>(.*)<\/\1>| *\/>)

  2. 提取颜色代码#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})

  3. 匹配IP地址\b(?:\d{1,3}\.){3}\d{1,3}\b

  4. 查找重复单词\b(\w+)\s+\1\b

总结

正则表达式是每个开发者都应该掌握的重要技能。虽然学习曲线稍陡峭,但一旦掌握,将极大提升你的文本处理能力。记住:

  1. 循序渐进:从基础开始,逐步学习复杂模式

  2. 多练习:实际应用是最好的学习方式

  3. 善用工具:使用在线测试工具辅助学习

  4. 注重可读性:复杂的正则要添加注释或拆分

掌握正则表达式,让你在文本处理领域游刃有余!


评论