JavaScript 正则表达式知识点大全
专为编程小白设计的正则表达式详细指南,用最简单的语言解释复杂概念
什么是正则表达式?
正则表达式(Regular Expression)是一种强大的文本处理工具,它使用特定模式来匹配、查找或替换字符串中的内容。
想象一下:你有一本书,你想找到所有包含”apple”的句子。正则表达式就像是专门用来做这种查找工作的智能工具。
主要用途
- 验证用户输入(如邮箱、电话号码)
- 在文本中查找特定内容
- 替换文本中的某些部分
- 从字符串中提取特定信息
创建正则表达式
在JavaScript中,有两种创建正则表达式的方式:
1. 字面量语法
let regex = /pattern/flags;
示例:查找”apple”(不区分大小写)
let appleRegex = /apple/i;
2. 构造函数方式
let regex = new RegExp(“pattern”, “flags”);
示例:同上效果
let appleRegex = new RegExp(“apple”, “i”);
何时使用哪种?
字面量语法更简洁常用,但当你需要动态构建正则表达式时,必须使用构造函数方式。
字面量语法更简洁常用,但当你需要动态构建正则表达式时,必须使用构造函数方式。
常用符号与含义
基础符号
- . – 匹配任意单个字符(除换行符)
- \d – 匹配数字(0-9)
- \w – 匹配字母、数字或下划线
- \s – 匹配空白字符(空格、制表符等)
- ^ – 匹配字符串的开始
- $ – 匹配字符串的结束
量词
- * – 0次或多次
- + – 1次或多次
- ? – 0次或1次
- {n} – 恰好n次
- {n,} – 至少n次
- {n,m} – 至少n次,不超过m次
示例:匹配日期格式
\d{4}-\d{2}-\d{2} 可以匹配”2023-05-15″
修饰符(Flags)
修饰符放在正则表达式末尾(如 /pattern/g),用于改变匹配方式:
- i – 不区分大小写
- g – 全局匹配(查找所有匹配而非在第一个匹配后停止)
- m – 多行模式(使 ^ 和 $ 匹配每行的开头和结尾)
- s – 使 . 匹配包括换行符在内的所有字符
- u – 启用完整的Unicode支持
- y – 粘性匹配(从目标字符串的当前位置开始)
// 示例:全局不区分大小写匹配
let regex = /apple/ig;
字符类(Character Classes)
字符类用于匹配一组字符中的任意一个:
// 匹配a, b或c中的任意一个字符
let regex = /[abc]/;
// 匹配任何元音字母(不区分大小写)
let vowelRegex = /[aeiou]/i;
// 匹配0到9的数字
let digitRegex = /[0-9]/;
// 匹配任何非数字字符
let nonDigitRegex = /[^0-9]/;
提示: 在方括号内使用 ^ 表示”非”,例如 [^0-9] 表示任何非数字字符。
JavaScript中的正则方法
String方法
- test() – 检查字符串是否匹配模式
- exec() – 查找匹配并返回详细信息
RegExp方法
- match() – 返回所有匹配的数组
- matchAll() – 返回所有匹配的迭代器
- search() – 返回第一个匹配的索引
- replace() – 替换匹配内容
- split() – 使用正则拆分字符串
// 使用test()方法验证邮箱
let emailRegex = /^\w+@\w+\.\w+$/;
let isValid = emailRegex.test(“user@example.com”); // true
// 使用match()方法提取所有数字
let str = “2023年5月15日”;
let numbers = str.match(/\d+/g); // [“2023”, “5”, “15”]
分组与捕获
使用圆括号 () 创建分组:
- 将多个字符视为一个整体
- 创建捕获组以便后续使用
- 应用量词到整个分组
// 匹配重复的单词
let repeatRegex = /(\w+)\s+\1/;
repeatRegex.test(“hello hello”); // true
// 提取日期各部分
let dateRegex = /(\d{4})-(\d{2})-(\d{2})/;
let result = dateRegex.exec(“2023-05-15”);
// result[0]: “2023-05-15” (完整匹配)
// result[1]: “2023” (年)
// result[2]: “05” (月)
// result[3]: “15” (日)
注意: 如果不需要捕获分组,可以使用非捕获分组 (?:…),避免占用内存和提高性能。
实际应用示例
1. 验证邮箱格式
let emailRegex = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
emailRegex.test(“user.name@example.com”); // true
2. 提取URL中的域名
let url = “https://www.example.com/path/page.html”;
let domain = url.match(/https?:\/\/([^\/?#]+)(?:[\/?#]|$)/i)[1];
// “www.example.com”
3. 移除多余空格
let text = ” Hello World! “;
let cleanText = text.replace(/\s+/g, ‘ ‘).trim();
// “Hello World!”
4. 密码强度校验
// 至少8个字符,包含大小写字母和数字
let strongPasswordRegex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$/;