正则表达式(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、电话号码等)
- 注意不同语言中正则表达式实现的细微差异
正则表达式虽然学习曲线较陡,但一旦掌握,可以极大地提高文本处理的效率和能力。