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
对象和相关字符串方法(如 match
、replace
)支持正则表达式。它的灵活性使其在处理复杂字符串操作时非常有用,但语法复杂性也可能导致误用。
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
对象的属性(如 global
、ignoreCase
)访问。
4. 模式语法
模式是正则表达式的核心,包含多种元素:
4.1 元字符
.
:匹配除换行符以外的任何单个字符。\d
:匹配数字,等同于[0-9]
。\w
:匹配字母、数字或下划线,等同于[A-Za-z0-9_]
。\s
:匹配空白字符,包括空格、制表符和换行符。\b
:匹配单词边界。^
:匹配字符串开始。$
:匹配字符串结束。
4.2 字符类
[abc]
:匹配a
、b
或c
中的任何一个。[^abc]
:匹配任何不是a
、b
或c
的字符。[0-9]
:匹配 0 到 9 的任何数字。
4.3 分组和捕获
(pattern)
:捕获组,用于分组和引用,例如/(foo) (bar) \1 \2/
匹配并记住foo bar
。(?:pattern)
:非捕获组,不创建捕获组,仅用于分组。
4.4 量词
*
:匹配前面的元素零次或多次,例如/bo*/
匹配b
、bo
、boooo
。+
:匹配前面的元素一次或多次,例如/a+/
匹配a
、aa
。?
:匹配前面的元素零次或一次,例如/e?le?/
匹配el
或le
。{n}
:匹配前面的元素恰好 n 次,例如/a{2}/
匹配aa
。{n,}
:匹配前面的元素至少 n 次,例如/a{2,}/
匹配aa
、aaa
。{n,m}
:匹配前面的元素 n 到 m 次,例如/a{1,3}/
匹配a
、aa
、aaa
。
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/
匹配green
或red
。 - Unicode 转义:
\u{xxxx}
,如\u{1F600}
匹配笑脸符号。
5. 使用方法
正则表达式与多种方法配合使用,常见的有:
test()
:测试字符串是否匹配,返回true
或false
。例如:/e/.test("hello")
返回true
。exec()
:执行匹配,返回匹配结果数组或null
,并更新RegExp
的lastIndex
属性。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"
的历史遗留问题(虽然与正则表达式直接相关性较低)。社区曾提议修正某些行为,但因兼容性问题未实现。