JavaScript正则表达式实例详解:实践指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JavaScript正则表达式实例详解:实践指南

\n\n

正则表达式(RegExp)是用于文本搜索、替换和验证的强大工具。在JavaScript中,尤其是在Node.js环境中,它们被广泛应用于日志解析、表单验证等场景。本文将深入讲解语法、方法,并提供可直接用于项目的实用示例。

\n\n

1. 基础语法与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
    \n
  • . — 除换行符外的任意字符
  • \n
  • \\d — 数字(0-9)
  • \n
  • \\w — 字母、数字或下划线
  • \n
  • \\s — 空白字符(空格、制表符、换行符)
  • \n
  • ^ — 字符串开头
  • \n
  • $ — 字符串结尾
  • \n
  • [] — 字符类(例如[a-z]表示所有小写字母)
  • \n
  • () — 捕获组
  • \n
  • | — 逻辑或
  • \n
\n\n

2. 正则表达式的主要方法

\n\n

JavaScript中有多个与RegExp配合使用的方法。下面通过实际示例进行讲解。

\n\n

2.1. test() — 匹配检查

\n

该方法返回true或false,非常适合验证场景。

\n\n
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\n

2.2. exec() — 详细搜索

\n

返回包含匹配项和捕获组的数组,便于提取数据。

\n\n
const 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\n

2.3. match() — 字符串搜索

\n

字符串方法,返回匹配数组。使用g标志返回所有匹配项,否则返回第一个匹配项及其捕获组。

\n\n
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\n

2.4. replace() — 文本替换

\n

将匹配项替换为新字符串。支持特殊字符,如用于捕获组的$1。

\n\n
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                

博客

书籍推荐