JavaScript 正则表达式完全指南:RegExp 语法与常用模式
Introduction
正则表达式(Regular Expression)是处理字符串的强大工具,广泛用于表单验证、文本搜索替换、数据提取等场景。JavaScript 通过 RegExp 对象和 String.prototype.match/replace/split/test 等方法提供完整的正则支持。掌握正则语法是每个开发者的必备技能。
正则表达式创建与基础
/* 方式1:字面量(推荐,性能更好)*/
var pattern = /hello/i; // i = 不区分大小写
/* 方式2:构造函数 */
var pattern = new RegExp('hello', 'i');
/* 基础方法 */
'hello world'.match(/hello/); // ['hello', index: 0, input: '...']
/hello/.test('hello world'); // true
'hello world'.replace(/world/, 'JavaScript'); // 'hello JavaScript'
'hello hello hello'.split(/hello/); // ['', ' ', ' ', '']
字符类与量词
/* 字符类 */
[abc] // 匹配 a、b 或 c 任意一个
[^abc] // 匹配除 a、b、c 以外的任意字符
[a-z] // 匹配小写字母
[A-Z] // 匹配大写字母
[0-9] // 匹配数字
\w // 等同于 [a-zA-Z0-9_](单词字符)
\W // 等同于 [^a-zA-Z0-9_]
\d // 等同于 [0-9]
\D // 等同于 [^0-9]
\s // 空白字符(空格、制表符、换行)
. // 任意字符(换行符除外)
/* 量词 */
x* // x 出现0次或多次
x+ // x 出现1次或多次
x? // x 出现0次或1次
x{3} // x 恰好出现3次
x{3,5} // x 出现3到5次
x{3,} // x 出现至少3次
x*? // 非贪婪匹配(尽可能少)*/
/code>
锚点与分组
/* 锚点 */
^ // 字符串开头(多行模式下匹配行首)
$ // 字符串结尾(多行模式下匹配行尾)
\b // 单词边界
\B // 非单词边界
/* 分组 */
(ab)+ // 捕获组:ab 出现一次或多次
(?:ab)+ // 非捕获组:不创建反向引用
(?<name>ab) // 命名捕获组
/* 反向引用 */
/(.)\1/ // 匹配连续两个相同字符(如 aa、bb)
/* 先行断言 */
x(?=y) // 正向先行:x 后面跟 y 时匹配 x(不消耗 y)
x(?!y) // 负向先行:x 后面不跟 y 时匹配 x
常用模式实战
/* 1. 邮箱验证 */
var email = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
/* 2. 手机号验证(中国大陆)*/
var phone = /^1[3-9]\d{9}$/;
/* 3. 身份证号验证 */
var idCard = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])\d{2}\d{3}[\dXx]$/;
/* 4. URL 提取 */
var url = /https?:\/\/[^\s/$.?#].[^\s]*/g;
/* 5. HTML 标签内容提取 */
var tagContent = /<(\w+)>([\s\S]*?)<\/>/g;
/* 6. 去掉首尾空白 */
var trimStr = function(str) {
return str.replace(/^\s+|\s+$/g, '');
};
常见问题
- 贪婪 vs 非贪婪:默认贪婪匹配(尽可能多),在量词后加 ? 变为非贪婪(尽可能少)。例如 <.+> 匹配整段 HTML,<.+?> 匹配单个标签。
- 转义字符:正则中的特殊字符(.、*、+、?、^、|、\、()、{}、[])需要用 \ 转义才能匹配字面量。
- test vs match:test 只返回 boolean(适合验证);match 返回数组(适合提取),且加了 g 标志后不再返回捕获组信息。
- String.split 正则:split() 支持正则,可以实现更灵活的分隔,比如 /,\s*/ 匹配逗号后可选空格。
- MDN RegExp:MDN RegExp
- 正则表达式可视化:regexper.com