JavaScript正则表达式实例详解:实践指南
\n\n正则表达式(RegExp)是用于文本搜索、替换和验证的强大工具。在JavaScript中,尤其是在Node.js环境中,它们被广泛应用于日志解析、表单验证等场景。本文将深入讲解语法、方法,并提供可直接用于项目的实用示例。
\n\n1. 基础语法与RegExp创建
\n\n在JavaScript中,正则表达式可以通过两种方式创建:字面量和构造函数。字面量适用于静态模式,构造函数适用于动态模式。
\n\n// 字面量(推荐)\nconst regexLiteral = /hello/gi;\n\n// 构造函数(用于动态模式)\nconst pattern = "hello";\nconst flags = "gi";\nconst regexConstructor = new RegExp(pattern, flags);\n\n标志(修饰符):
\n- \n
g— 全局搜索(查找所有匹配项,而非第一个) \n i— 不区分大小写搜索 \n m— 多行模式(锚点^和$作用于每一行) \n s— 允许点号.匹配换行符 \n u— 启用完整Unicode支持 \n
基本元字符:
\n- \n
.— 除换行符外的任意字符 \n \\d— 数字(0-9) \n \\w— 字母、数字或下划线 \n \\s— 空白字符(空格、制表符、换行符) \n ^— 字符串开头 \n $— 字符串结尾 \n []— 字符类(例如[a-z]表示所有小写字母) \n ()— 捕获组 \n |— 逻辑或 \n
2. 正则表达式的主要方法
\n\nJavaScript中有多个与RegExp配合使用的方法。下面通过实际示例进行讲解。
\n\n2.1. test() — 匹配检查
\n该方法返回true或false,非常适合验证场景。
const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\nconst emails = ["user@example.com", "invalid-email", "test@domain.co.uk"];\n\nemails.forEach(email => {\n console.log(`${email}: ${emailPattern.test(email)}`);\n});\n// user@example.com: true\n// invalid-email: false\n// test@domain.co.uk: true\n\n2.2. exec() — 详细搜索
\n返回包含匹配项和捕获组的数组,便于提取数据。
\n\nconst logLine = "ERROR: 2023-10-15 14:30:00 - Server crash";\nconst logPattern = /^(ERROR|WARN|INFO): (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) - (.+)$/;\nconst result = logPattern.exec(logLine);\n\nif (result) {\n console.log(`级别: ${result[1]}`);\n console.log(`日期: ${result[2]}`);\n console.log(`消息: ${result[3]}`);\n}\n// 级别: ERROR\n// 日期: 2023-10-15 14:30:00\n// 消息: Server crash\n\n2.3. match() — 字符串搜索
\n字符串方法,返回匹配数组。使用g标志返回所有匹配项,否则返回第一个匹配项及其捕获组。
const text = "电话: +7(999)123-45-67, +7(495)765-43-21";\nconst phonePattern = /\\+7\\(\\d{3}\\)\\d{3}-\\d{2}-\\d{2}/g;\nconst phones = text.match(phonePattern);\n\nconsole.log(phones);\n// ['+7(999)123-45-67', '+7(495)765-43-21']\n\n2.4. replace() — 文本替换
\n将匹配项替换为新字符串。支持特殊字符,如用于捕获组的$1。
const messyDate = "2023/10/15";\nconst cleanDate = messyDate.replace(/(\\d{4})\\/(\\d{2})\\/(\\d{2})/, "$3.$2.$1");\nconsole.log(cleanDate); // 15.10.2023\n\n