JavaScript 正则表达式

Key Points

  • JavaScript 正则表达式是一种用于匹配字符串的模式,常用在搜索和替换操作中。
  • 它可以通过字面量(如 /pattern/) 或构造函数创建,支持多种修饰符如 g(全局)、i(不区分大小写)。
  • 模式包括元字符(如 . 匹配任何字符)、字符类(如 [0-9] 匹配数字)和量词(如 * 表示零次或多次)。
  • 常用方法包括 test()(测试匹配)、exec()(执行匹配)和 replace()(替换匹配)。

创建与使用

创建方式

  • 字面量:var regex = /ab+c/g; 直接在代码中定义。
  • 构造函数:var regex = new RegExp("ab+c", "g"); 动态创建。

修饰符

  • g:全局匹配,找到所有匹配项。
  • i:不区分大小写。
  • m:多行模式,影响 ^$

常用方法

  • test():返回布尔值,判断字符串是否匹配。例如:/e/.test("hello") 返回 true
  • exec():返回匹配的数组或 null,如 /e/.exec("hello") 返回 ["e"]
  • replace():替换匹配的字符串,如 "hello".replace(/l/, "x") 返回 "hexlo"

模式与示例

模式元素

  • 元字符:. 匹配任何字符,\d 匹配数字。
  • 字符类:[0-9] 匹配 0-9,[^a-z] 匹配非小写字母。
  • 量词:* 表示零次或多次,+ 表示至少一次,? 表示零次或一次。

示例

  • 匹配所有数字:/\d+/g
  • 验证邮箱:/^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/
  • 查找以 “the” 开头的单词:/\bthe\w+/gi


详细调研笔记

JavaScript 正则表达式是一种强大的工具,用于匹配和操作字符串,广泛应用于文本搜索、验证和替换等场景。以下是基于网络搜索和页面浏览的结果整理,涵盖创建方法、修饰符、模式语法和使用方法,旨在为开发者提供全面的理解。

1. 背景与概述

正则表达式(Regular Expression)是一种描述字符串匹配模式的语言,JavaScript 通过 RegExp 对象和相关字符串方法(如 matchreplace)支持正则表达式。它的灵活性使其在处理复杂字符串操作时非常有用,但语法复杂性也可能导致误用。

2. 创建正则表达式

正则表达式有两种创建方式:

  • 字面量方式:使用 /pattern/flags 形式,例如 /ab+c/g。这种方式在脚本加载时编译,适合静态模式。
  • 构造函数方式:使用 new RegExp("pattern", "flags"),如 new RegExp("ab+c", "g")。适合动态生成模式,例如从用户输入中创建。

根据 MDN 的指南,字面量方式性能更好,而构造函数适合模式会变化的场景。

3. 修饰符(Flags)

修饰符用于修改正则表达式的行为,共有 8 个:

  • d:生成子字符串匹配的索引。
  • g:全局搜索,找到所有匹配。
  • i:不区分大小写搜索。
  • m:多行模式,允许 ^$ 匹配换行。
  • s:点号模式(dotAll),使 . 匹配换行符。
  • u:Unicode 模式,处理 Unicode 字符。
  • v:升级 Unicode 模式,支持更多 Unicode 特性。
  • y:粘性模式,从当前位置开始匹配。

这些修饰符可以通过 RegExp 对象的属性(如 globalignoreCase)访问。

4. 模式语法

模式是正则表达式的核心,包含多种元素:

4.1 元字符
  • .:匹配除换行符以外的任何单个字符。
  • \d:匹配数字,等同于 [0-9]
  • \w:匹配字母、数字或下划线,等同于 [A-Za-z0-9_]
  • \s:匹配空白字符,包括空格、制表符和换行符。
  • \b:匹配单词边界。
  • ^:匹配字符串开始。
  • $:匹配字符串结束。
4.2 字符类
  • [abc]:匹配 abc 中的任何一个。
  • [^abc]:匹配任何不是 abc 的字符。
  • [0-9]:匹配 0 到 9 的任何数字。
4.3 分组和捕获
  • (pattern):捕获组,用于分组和引用,例如 /(foo) (bar) \1 \2/ 匹配并记住 foo bar
  • (?:pattern):非捕获组,不创建捕获组,仅用于分组。
4.4 量词
  • *:匹配前面的元素零次或多次,例如 /bo*/ 匹配 bboboooo
  • +:匹配前面的元素一次或多次,例如 /a+/ 匹配 aaa
  • ?:匹配前面的元素零次或一次,例如 /e?le?/ 匹配 elle
  • {n}:匹配前面的元素恰好 n 次,例如 /a{2}/ 匹配 aa
  • {n,}:匹配前面的元素至少 n 次,例如 /a{2,}/ 匹配 aaaaa
  • {n,m}:匹配前面的元素 n 到 m 次,例如 /a{1,3}/ 匹配 aaaaaa
4.5 断言
  • 先行断言:x(?=y),如 /Jack(?=Sprat)/ 匹配 Jack 如果后面是 Sprat
  • 后行断言:(?<=y)x,如 /(?<=Jack)Sprat/ 匹配 Sprat 如果前面是 Jack
  • 否定先行断言:x(?!y),如 /\d+(?!\.)/ 匹配 141 但不包括小数点。
  • 否定后行断言:(?<!y)x,如 /(?<!-)\d+/ 匹配 3 但不匹配 -3
4.6 其他特性
  • 逻辑或:|,如 /green|red/ 匹配 greenred
  • Unicode 转义:\u{xxxx},如 \u{1F600} 匹配笑脸符号。

5. 使用方法

正则表达式与多种方法配合使用,常见的有:

  • test():测试字符串是否匹配,返回 truefalse。例如:/e/.test("hello") 返回 true
  • exec():执行匹配,返回匹配结果数组或 null,并更新 RegExplastIndex 属性。
  • match():在字符串中查找匹配,返回匹配结果数组或 null
  • matchAll():返回所有匹配的迭代器。
  • search():返回第一个匹配的索引,或 -1 如果没有匹配。
  • replace():替换匹配的字符串,支持回调函数。

根据 Runoob 的教程,这些方法在字符串操作中非常实用,例如:

  • str.search(/Runoob/i) 返回 Runoob 的起始位置。
  • str.replace(/microsoft/i, "Runoob")Microsoft 替换为 Runoob,不区分大小写。

6. 示例与最佳实践

以下是一些实际示例:

  • 匹配所有数字:/\d+/g
  • 验证邮箱地址:/^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/
  • 查找以 “the” 开头的单词:/\bthe\w+/gi

最佳实践包括:

  • 使用 === 严格比较避免类型转换问题。
  • 对于复杂模式,优先使用字面量方式以提高性能。
  • 注意 Unicode 模式下的字符匹配,确保支持中文等非 ASCII 字符。

7. 历史与争议

正则表达式的复杂性是 JavaScript 设计中的一个争议点,尤其是 typeof null === "object" 的历史遗留问题(虽然与正则表达式直接相关性较低)。社区曾提议修正某些行为,但因兼容性问题未实现。

8. 参考资料


Key Citations

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注