正则表达式语法
在 JavaScript 中,正则表达式(RegExp)是用于匹配字符串中字符组合的模式。以下是核心语法详解:
一、创建正则表达式
字面量形式(推荐):
javascriptconst regex = /pattern/flags;
- 例:
/ab+c/i
(匹配 "abc"、"AbC" 等,忽略大小写)
- 例:
构造函数形式:
javascriptconst regex = new RegExp('pattern', 'flags');
- 例:
new RegExp('ab+c', 'i')
(动态生成时常用)
- 例:
二、修饰符(Flags)
标志 | 作用 | 示例 |
---|---|---|
i | 不区分大小写 | /test/i 匹配 "Test" |
g | 全局匹配(所有结果) | /a/g 匹配所有 "a" |
m | 多行模式(^ 和$ 匹配每行开头结尾) | /^a/gm 匹配每行开头的 "a" |
s | 允许. 匹配换行符(ES2018+) | /a.b/s 匹配 "a\nb" |
u | Unicode 模式(处理 UTF-16) | /𠮷/u 匹配 Unicode 字符 |
y | 粘滞模式(从lastIndex 开始匹配) | /a/y 连续匹配时使用 |
三、元字符与字符类
语法 | 含义 |
---|---|
. | 匹配除换行符外的任意字符(启用s 时包含换行符) |
\d | 数字(等价于 [0-9] ) |
\D | 非数字(等价于 [^0-9] ) |
\w | 单词字符(字母、数字、下划线,等价于 [A-Za-z0-9_] ) |
\W | 非单词字符 |
\s | 空白符(空格、制表符、换行等) |
\S | 非空白符 |
[abc] | 匹配 a、b 或 c 中的任意一个字符 |
[^abc] | 匹配除 a、b、c 外的任意字符 |
[a-z] | 匹配 a 到 z 范围内的字符 |
四、量词(重复匹配)
语法 | 含义 | 示例 |
---|---|---|
a* | 0 次或多次 | /bo*/ 匹配 "b"、"boo" |
a+ | 1 次或多次 | /a+/ 匹配 "a"、"aa" |
a? | 0 次或 1 次(可选) | /e?le?/ 匹配 "el"、"le" |
a{3} | 精确匹配 3 次 | /a{3}/ 匹配 "aaa" |
a{3,} | 至少 3 次 | /a{3,}/ 匹配 "aaa"、"aaaa" |
a{3,5} | 3 到 5 次 | /a{3,5}/ 匹配 "aaa"、"aaaaa" |
a*? | 非贪婪模式(匹配最小可能) | /".*?"/ 匹配 "foo" 而非整个 "foo" bar" |
五、分组与捕获
捕获分组
( )
:javascript'2023-01-01'.match(/(\d{4})-(\d{2})-(\d{2})/); // 结果: ["2023-01-01", "2023", "01", "01"]
- 通过索引获取分组:
result[1]
→"2023"
- 通过索引获取分组:
非捕获分组
(?: )
:javascript'abc'.match(/(?:a)(b)(c)/); // 结果: ["abc", "b", "c"](不捕获 "a")
命名分组
(?<name>)
(ES2018+):javascriptconst { groups } = '2023-01-01'.match(/(?<year>\d{4})-(?<month>\d{2})/); console.log(groups.year); // "2023"
六、边界匹配
语法 | 含义 |
---|---|
^ | 字符串/行的开始(多行模式) |
$ | 字符串/行的结束(多行模式) |
\b | 单词边界 |
\B | 非单词边界 |
示例:
javascript
// 匹配独立的单词 "test"
/\btest\b/.test('this is a test'); // true
七、断言(Lookaround)
语法 | 名称 | 作用 |
---|---|---|
x(?=y) | 正向肯定断言 | 匹配后面是 y 的 x |
x(?!y) | 正向否定断言 | 匹配后面不是 y 的 x |
(?<=y)x | 反向肯定断言 | 匹配前面是 y 的 x |
(?<!y)x | 反向否定断言 | 匹配前面不是 y 的 x |
示例:
javascript
// 匹配后面是 " dollars" 的数字
/\d+(?= dollars)/.exec('100 dollars'); // ["100"]
// 匹配前面是 "$" 的数字
/(?<=\$)\d+/.exec('$100'); // ["100"]
八、常用方法
test()
:检测是否匹配javascript/abc/.test('abcdef'); // true
exec()
:返回匹配结果(含分组)javascript/a(b)c/.exec('abc'); // ["abc", "b", index:0, ...]
字符串方法:
javascript'abc'.match(/a(b)c/); // 同 exec() 'abc'.replace(/a/, 'x'); // "xbc" 'a,b,c'.split(/,/); // ["a", "b", "c"] 'abc'.search(/b/); // 返回位置 1
九、特殊转义
- 匹配元字符需转义:
[ ] \ ^ $ . | ? * + ( ) { }
javascript/\.com/.test('example.com'); // true(匹配 ".")
- Unicode 字符:
\u{1F4A9}
(启用u
标志)javascript/\u{1F4A9}/u.test('💩'); // true
十、示例综合
javascript
// 匹配电子邮件
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
emailRegex.test('user@example.com'); // true
// 提取日期中的年月(命名分组)
const { year, month } = '2023-12-31'.match(
/(?<year>\d{4})-(?<month>\d{2})/
).groups;
掌握这些核心语法,即可高效处理 JavaScript 中的文本匹配任务!