JavaScript 正则表达式完全指南:RegExp 语法与常用模式

小飞兽 JavaScript 99 次阅读 2026-06-05

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*/ 匹配逗号后可选空格。

    延伸阅读

  • 正则表达式可视化:regexper.com