正则表达式常用语法参考
正则表达式常用语法参考
目录
- 基础概念
- 字符类
- 量词
- 位置锚点
- 分组和引用
- 转义字符
- 修饰符
- 常用模式
- 实际应用示例
基础概念
正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串模式的工具,广泛应用于文本搜索、替换、验证等场景。
基本语法结构
/pattern/flags
pattern
: 匹配模式flags
: 修饰符(可选)
字符类
普通字符
直接匹配字符本身
a # 匹配字母 'a'
123 # 匹配数字 '123'
特殊字符
需要转义的字符:^ $ . * + ? { } [ ] \ | ( )
字符集合
[abc] # 匹配 a、b 或 c 中的任意一个
[^abc] # 匹配除了 a、b、c 之外的任意字符
[a-z] # 匹配小写字母 a 到 z
[A-Z] # 匹配大写字母 A 到 Z
[0-9] # 匹配数字 0 到 9
[a-zA-Z] # 匹配任意字母
[a-zA-Z0-9] # 匹配字母和数字
预定义字符类
. # 匹配任意字符(除换行符外)
\d # 匹配数字 [0-9]
\D # 匹配非数字 [^0-9]
\w # 匹配单词字符 [a-zA-Z0-9_]
\W # 匹配非单词字符 [^a-zA-Z0-9_]
\s # 匹配空白字符 [\t\n\r\f\v]
\S # 匹配非空白字符 [^\t\n\r\f\v]
量词
基本量词
* # 匹配前面的元素 0 次或多次
+ # 匹配前面的元素 1 次或多次
? # 匹配前面的元素 0 次或 1 次
{n} # 匹配前面的元素恰好 n 次
{n,} # 匹配前面的元素至少 n 次
{n,m} # 匹配前面的元素 n 到 m 次
贪婪与非贪婪
* # 贪婪匹配(默认)
*? # 非贪婪匹配
+ # 贪婪匹配
+? # 非贪婪匹配
? # 贪婪匹配
?? # 非贪婪匹配
位置锚点
行首行尾
^ # 匹配行首
$ # 匹配行尾
\A # 匹配字符串开始
\Z # 匹配字符串结束
单词边界
\b # 匹配单词边界
\B # 匹配非单词边界
分组和引用
分组
(abc) # 捕获组
(?:abc) # 非捕获组
(?<name>abc) # 命名捕获组
反向引用
\1 # 引用第一个捕获组
\2 # 引用第二个捕获组
\k<name> # 引用命名捕获组
条件匹配
(?=abc) # 正向先行断言
(?!abc) # 负向先行断言
(?<=abc) # 正向后行断言
(?<!abc) # 负向后行断言
转义字符
常用转义
\\ # 反斜杠
\. # 点号
\* # 星号
\+ # 加号
\? # 问号
\{ # 左大括号
\} # 右大括号
\[ # 左方括号
\] # 右方括号
\( # 左圆括号
\) # 右圆括号
\^ # 脱字符
\$ # 美元符号
\| # 竖线
特殊转义
\n # 换行符
\r # 回车符
\t # 制表符
\f # 换页符
\v # 垂直制表符
\xhh # 十六进制字符
\uhhhh # Unicode 字符
修饰符
常用修饰符
i # 忽略大小写
g # 全局匹配
m # 多行模式
s # 单行模式(点号匹配换行符)
u # Unicode 模式
y # 粘性匹配
常用模式
邮箱验证
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
手机号验证(中国大陆)
^1[3-9]\d{9}$
身份证号验证(中国大陆)
^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$
URL 验证
^https?://[^\s/$.?#].[^\s]*$
密码强度验证
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$
日期格式验证(YYYY-MM-DD)
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
实际应用示例
1. 提取邮箱地址
const text = "联系我:user@example.com 或 admin@test.org";
const emailRegex = /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g;
const emails = text.match(emailRegex);
// 结果: ["user@example.com", "admin@test.org"]
2. 验证密码强度
const password = "MyPass123!";
const strongPasswordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
const isValid = strongPasswordRegex.test(password);
// 结果: true
3. 格式化电话号码
const phone = "13812345678";
const formatted = phone.replace(/(\d{3})(\d{4})(\d{4})/, "$1-$2-$3");
// 结果: "138-1234-5678"
4. 提取HTML标签内容
const html = "<div>Hello World</div><p>Test</p>";
const contentRegex = /<[^>]*>([^<]*)<\/[^>]*>/g;
const contents = [];
let match;
while ((match = contentRegex.exec(html)) !== null) {contents.push(match[1]);
}
// 结果: ["Hello World", "Test"]
5. 验证信用卡号(Luhn算法)
function validateCreditCard(cardNumber) {const cleanNumber = cardNumber.replace(/\D/g, '');if (!/^\d{13,19}$/.test(cleanNumber)) return false;let sum = 0;let isEven = false;for (let i = cleanNumber.length - 1; i >= 0; i--) {let digit = parseInt(cleanNumber[i]);if (isEven) {digit *= 2;if (digit > 9) digit -= 9;}sum += digit;isEven = !isEven;}return sum % 10 === 0;
}
常用工具和资源
在线测试工具
- Regex101 - 功能强大的正则表达式测试工具
- RegExr - 学习、构建和测试正则表达式
- RegexPal - 简单的正则表达式测试工具
编程语言支持
- JavaScript: 内置支持,使用
RegExp
对象 - Python:
re
模块 - Java:
java.util.regex
包 - C#:
System.Text.RegularExpressions
命名空间 - PHP:
preg_*
函数系列
学习资源
- 正则表达式30分钟入门教程
- MDN Web Docs - 正则表达式
- 菜鸟教程 - 正则表达式
注意事项
- 性能考虑: 复杂的正则表达式可能影响性能,特别是在大文本中
- 可读性: 过于复杂的正则表达式难以维护,建议适当拆分
- 边界情况: 测试各种边界情况,确保正则表达式的准确性
- 语言差异: 不同编程语言的正则表达式语法可能有细微差别
- 安全性: 避免使用用户输入直接构建正则表达式,防止正则表达式注入攻击
本文档提供了正则表达式的基础语法和常用模式,建议在实际使用中根据具体需求进行调整和优化。