目录
一、正则表达式基础
1. 什么是正则表达式?
2. 基本语法
二、字符匹配
1. 字符集合
2. 量词
三、分组与断言
1. 分组
2. 断言
四、修饰符(Flags)
五、在 JavaScript 中使用正则表达式
1. 创建正则表达式
2. 常用方法
3. 示例:提取数据
六、常见正则表达式用例
1. 邮箱验证
2. 手机号验证(中国大陆)
3. URL 提取
4. 密码强度(至少8位,含大小写和数字)
总结
一、正则表达式基础
1. 什么是正则表达式?
正则表达式(Regular Expression)是一种用于 匹配字符串中字符组合的模式,常用于:
-
表单验证(邮箱、手机号、密码强度)
-
文本搜索/替换
-
数据提取(如日志分析)
-
字符串格式检查
2. 基本语法
符号 | 含义 | 示例 |
---|---|---|
/pattern/ | 正则表达式字面量 | /abc/ 匹配 "abc" |
^ | 匹配字符串的开始 | /^start/ 匹配以 "start" 开头的字符串 |
$ | 匹配字符串的结束 | /end$/ 匹配以 "end" 结尾的字符串 |
. | 匹配任意单个字符(除换行符) | /a.c/ 匹配 "abc"、"aXc" 等 |
\ | 转义特殊字符 | /\.com/ 匹配 ".com" |
二、字符匹配
1. 字符集合
符号 | 含义 | 示例 |
---|---|---|
[abc] | 匹配任意一个字符(a、b 或 c) | /[aeiou]/ 匹配元音字母 |
[^abc] | 匹配不在集合中的字符 | /[^0-9]/ 匹配非数字字符 |
[a-z] | 匹配范围内的字符(小写字母) | /[a-zA-Z]/ 匹配所有字母 |
\d | 匹配数字(等价于 [0-9] ) | /\d+/ 匹配连续数字 |
\D | 匹配非数字(等价于 [^0-9] ) | /\D/ 匹配非数字字符 |
\w | 匹配单词字符(字母、数字、下划线) | /\w+/ 匹配单词 |
\W | 匹配非单词字符 | /\W/ 匹配符号(如@、#) |
\s | 匹配空白字符(空格、制表符、换行符) | /\s+/ 匹配连续空白 |
\S | 匹配非空白字符 | /\S/ 匹配可见字符 |
2. 量词
符号 | 含义 | 示例 |
---|---|---|
* | 匹配前一项 0 次或多次(贪婪) | /a*/ 匹配 "a"、"aaa" 或空字符串 |
+ | 匹配前一项 1 次或多次(贪婪) | /\d+/ 匹配连续数字(如 "123") |
? | 匹配前一项 0 次或 1 次(贪婪) | /colou?r/ 匹配 "color" 或 "colour" |
{n} | 匹配前一项恰好 n 次 | /\d{4}/ 匹配 4 位数字 |
{n,} | 匹配前项至少 n 次 | /\d{2,}/ 匹配 2 位以上数字 |
{n,m} | 匹配前项 n 到 m 次 | /\d{3,5}/ 匹配 3 到 5 位数字 |
贪婪与非贪婪模式:
-
默认贪婪:尽可能多匹配(如
.*
) -
非贪婪:在量词后加
?
(如.*?
)
三、分组与断言
1. 分组
符号 | 含义 | 示例 |
---|---|---|
() | 捕获分组 | /(ab)+/ 匹配 "ab"、"abab" |
(?:) | 非捕获分组(不存储匹配结果) | /(?:ab)+/ 匹配但不捕获 |
2. 断言
符号 | 含义 | 示例 |
---|---|---|
(?=) | 正向先行断言(右侧必须匹配) | /a(?=b)/ 匹配后面是 "b" 的 "a" |
(?!) | 负向先行断言(右侧不能匹配) | /a(?!b)/ 匹配后面不是 "b" 的 "a" |
(?<=) | 正向后行断言(左侧必须匹配) | /(?<=a)b/ 匹配前面是 "a" 的 "b" |
(?<!) | 负向后行断言(左侧不能匹配) | /(?<!a)b/ 匹配前面不是 "a" 的 "b" |
四、修饰符(Flags)
修饰符 | 含义 | 示例 |
---|---|---|
g | 全局匹配(查找所有匹配项) | /a/g 匹配字符串中所有 "a" |
i | 不区分大小写 | /hello/i 匹配 "Hello"、"HELLO" |
m | 多行模式(^ 和 $ 匹配每行开头结尾) | /^start/m 匹配每行的 "start" |
s | 允许 . 匹配换行符(ES2018+) | /a.b/s 匹配 "a\nb" |
u | Unicode 模式(处理 Unicode 字符) | /\u{1F600}/u 匹配 😀 |
五、在 JavaScript 中使用正则表达式
1. 创建正则表达式
// 方式1:字面量(推荐)
const regex1 = /pattern/flags;// 方式2:构造函数(支持动态生成)
const regex2 = new RegExp('pattern', 'flags');
// 正则表达式的基本使用
const str = 'web前端开发'
// 1. 定义规则
const reg = /web/// 2. 使用正则 test()
console.log(reg.test(str)) // true 如果符合规则匹配上则返回true
console.log(reg.test('java开发')) // false 如果不符合规则匹配上则返回 false
2. 常用方法
方法 | 说明 | 示例 |
---|---|---|
test() | 检测字符串是否匹配模式(返回布尔值) | /abc/.test('abcdef') → true |
exec() | 执行搜索,返回匹配结果数组(包含分组) | /a(b)c/.exec('abc') → ['abc', 'b'] |
match() | 字符串方法,返回匹配结果数组 | 'hello'.match(/e/) → ['e'] |
replace() | 字符串方法,替换匹配内容 | 'abc'.replace(/a/, 'A') → 'Abc' |
search() | 字符串方法,返回匹配位置索引 | 'abc'.search(/b/) → 1 |
3. 示例:提取数据
const text = '日期:2024-07-12,时间:14:30';
const dateRegex = /(\d{4})-(\d{2})-(\d{2})/;
const match = text.match(dateRegex);
console.log(match); // ["2024-07-12", "2024", "07", "12"]
六、常见正则表达式用例
1. 邮箱验证
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
console.log(emailRegex.test('user@example.com')); // true
2. 手机号验证(中国大陆)
const phoneRegex = /^1[3-9]\d{9}$/;
console.log(phoneRegex.test('13812345678')); // true
3. URL 提取
const urlRegex = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/\S*)?$/i;
const urlParts = 'https://www.example.com/path'.match(urlRegex);
console.log(urlParts); // 分组捕获协议、域名、路径等
4. 密码强度(至少8位,含大小写和数字)
const passwordRegex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$/;
console.log(passwordRegex.test('Pass1234')); // true
总结
正则表达式是处理字符串的利器,通过灵活组合字符匹配、量词、分组和断言,可解决复杂的文本处理需求。在 JavaScript 中,结合 test()
、exec()
、replace()
等方法,能高效实现数据验证、提取与转换功能。