正则表达式(Regular Expression)详解
正则表达式(简称"regex"或"regexp")是一种强大的文本模式匹配工具,它使用特定语法来描述、匹配和操作字符串。
基本概念
正则表达式是由普通字符(如字母a到z)和特殊字符(称为"元字符")组成的文本模式。这个模式描述在搜索文本时要匹配的一个或多个字符串。
主要用途
- 验证:检查字符串是否符合特定模式(如邮箱、电话号码格式)
 - 搜索:在文本中查找特定模式的字符串
 - 替换:将匹配的文本替换为其他内容
 - 提取:从字符串中提取特定部分
 
基本语法
常见元字符
| 元字符 | 说明 | 
|---|---|
. | 匹配任意单个字符(除换行符外) | 
^ | 匹配字符串的开始位置 | 
$ | 匹配字符串的结束位置 | 
* | 匹配前面的子表达式零次或多次 | 
+ | 匹配前面的子表达式一次或多次 | 
? | 匹配前面的子表达式零次或一次 | 
\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[3-9]\d{9}$^:字符串开始1:数字1开头[3-9]:第二位是3-9中的一个数字\d{9}:后面跟着9个数字$:字符串结束
 -  
匹配邮箱:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ -  
匹配日期(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
 
进阶概念
-  
分组:使用
()捕获分组^(\d{3})-(\d{3,8})$ // 匹配区号-电话号码 -  
非贪婪匹配:在
*或+后加?实现最小匹配<.*?> // 匹配HTML标签(非贪婪模式) -  
先行断言:
(?=pattern)正向先行断言(?!pattern)负向先行断言
 -  
修饰符:
i不区分大小写g全局匹配m多行模式
 
学习建议
- 从简单模式开始练习
 - 使用在线工具(如regex101.com)测试你的正则表达式
 - 记住常见模式(如邮箱、URL、电话号码等)
 - 注意不同语言中正则表达式实现的细微差异
 
正则表达式虽然学习曲线较陡,但一旦掌握,可以极大地提高文本处理的效率和能力。
