如有错误和建议请评论告知。
RegExp
RegExp 类型的字面量写法:
let expression = /pattern/flags;
这个正则表达式的 pattern(模式)可以是任何简单或复杂的正则表达式。
正则表达式的标记
每个正则表达式可以带零个或多个 flags(标记),用于控制正则表达式的行为。
标记 | 功能 | 示例及解释 |
g |
全局匹配:查找所有匹配,而非找到第一个就停止。 | console.log("abcabc".match(/a/g)); // 输出:["a", "a"] |
i |
忽略大小写:匹配时不区分大小写。 | console.log("Abc".match(/a/i)); // 输出:["A"] |
m |
多行模式:^ 和` |
|
--- | --- | --- |
标记 | 功能 | 示例及解释 |
g |
全局匹配:查找所有匹配,而非找到第一个就停止。 | console.log("abcabc".match(/a/g)); // 输出:["a", "a"] |
i |
忽略大小写:匹配时不区分大小写。 | console.log("Abc".match(/a/i)); // 输出:["A"] |
匹配每一行的开头和结尾。 | console.log("a\nb".match(/^b/m)); // 输出:["b"] |
|
s |
单行模式(dotAll 模式):. 匹配包括换行符。 |
console.log("a\nb".match(/a.b/s)); // 输出:["a\nb"] |
u |
Unicode 模式:支持 Unicode 的完整字符匹配。 | console.log("\u{1F600}".match(/\u{1F600}/u)); // 输出:[""] |
y |
粘性匹配:从当前位置开始匹配,且不回溯。 | let re = /a/y; re.lastIndex = 1; console.log(re.test("ba")); // true |
d |
匹配索引:返回匹配项在字符串中的索引(ES2022)。 | console.log("abcabc".matchAll(/a/d)); // { index: 0 }, { index: 3 } |
正则表达式的元字符
1.字符匹配元字符
元字符 | 用途 | 示例 |
. |
匹配任意单个字符(除换行符)。 | /a.b/ 匹配 "acb" , "a1b" ,但不匹配 "ab" , "a\nb" 。 |
\d |
匹配任意数字(相当于 [0-9] )。 |
/\d+/ 匹配 "12345" 中的 "12345" 。 |
\D |
匹配非数字字符(相当于 [^0-9] )。 |
/\D+/ 匹配 "abc" ,但不匹配 "123" 。 |
\w |
匹配单词字符(字母、数字、下划线)。 | /\w+/ 匹配 "hello_123" 。 |
\W |
匹配非单词字符。 | /\W+/ 匹配 "@!#" 。 |
\s |
匹配空白字符(空格、制表符等)。 | /\s+/ 匹配字符串中的空格。 |
\S |
匹配非空白字符。 | /\S+/ 匹配 "abc" ,但不匹配 " " 。 |
\b |
匹配单词边界。 | /\bcat\b/ 匹配 "cat" ,但不匹配 "catalog" 或 "scatter" 。 |
\B |
匹配非单词边界。 | /\Bcat\B/ 匹配 "scattering" 中的 "cat" 。 |
2.定位元字符
元字符 | 用途 | 示例 |
^ |
匹配字符串开头。 | /^abc/ 匹配 "abc123" 的开头 "abc" ,但不匹配 "123abc" 。 |
` | ||
--- | --- | --- |
元字符 | 用途 | 示例 |
^ |
匹配字符串开头。 | /^abc/ 匹配 "abc123" 的开头 "abc" ,但不匹配 "123abc" 。 |
|匹配字符串结尾。|/abc$/ 匹配 "123abc" 的结尾 "abc" ,但不匹配 "abc123" 。 |
3.重复元字符
元字符 | 用途 | 示例 |
* |
匹配前一个字符 0 次或多次。 | /a*/ 匹配 "aaa" , "b" , "ab" 中的 "aaa" , "" , "a" 。 |
+ |
匹配前一个字符 1 次或多次。 | /a+/ 匹配 "aaa" , "ab" 中的"aaa" , "a" ,但不匹配 "b" 。 |
? |
匹配前一个字符 0 次或 1 次。 | /a?b/ 匹配 "b" , "ab" ,但不匹配 "aab" 。 |
{n} |
匹配前一个字符 恰好 n 次。 | /a{3}/ 匹配 "aaa" ,但不匹配 "aa" 或 "aaaa" 。 |
{n,} |
匹配前一个字符 至少 n 次。 | /a{2,}/ 匹配 "aaa" , "aaaa" ,但不匹配 "a" 。 |
{n,m} |
匹配前一个字符 至少 n 次,至多 m 次。 | /a{2,4}/ 匹配 "aa" , "aaa" , "aaaa" ,但不匹配 "a" 或 "aaaaa" 。 |
4.分组和选择元字符
元字符 | 用途 | 示例 |
() |
定义分组,用于捕获或控制优先级。 | /(ab)+/ 匹配 "ababab" 中的 "ababab" ;捕获 "ab" 。 |
(?:) |
定义非捕获分组,仅用于逻辑分组。 | /(?:ab)+/ 匹配 "ababab" 中的 "ababab" ,但不捕获 "ab" 。 |
` | ` | 逻辑或,匹配任意一个模式。 |
5.特殊元字符转义
元字符 | 用途 | 示例 |
\ |
转义字符,用于匹配元字符的字面值。 | /a\*b/ 匹配 "a*b" ,但不匹配 "ab" 。 |
\n |
匹配换行符。 | /a\nb/ 匹配字符串 "a\nb" 。 |
\t |
匹配制表符。 | /a\tb/ 匹配字符串 "a\tb" 。 |
6.字符集合和范围
元字符 | 用途 | 示例 |
[abc] |
匹配字符集合中的任意一个字符。 | /[abc]/ 匹配 "a" , "b" , "c" ,但不匹配 "d" 。 |
[^abc] |
匹配不在集合中的任意字符。 | /[^abc]/ 匹配 "d" , "e" ,但不匹配 "a" , "b" , "c" 。 |
[a-z] |
匹配字符范围内的任意字符。 | /[a-z]/ 匹配 "a" 到 "z" 中的任意小写字母。 |
[^a-z] |
匹配不在范围内的任意字符。 | /[^a-z]/ 匹配小写字母以外的字符。 |
7.断言元字符
元字符 | 用途 | 示例 |
(?=...) |
正向先行断言:匹配后面跟随某模式的字符串。 | /a(?=b)/ 匹配 "ab" 中的 "a" ,但不匹配 "ac" 。 |
(?!...) |
负向先行断言:匹配后面不跟随某模式的字符串。 | /a(?!b)/ 匹配 "ac" 中的 "a" ,但不匹配 "ab" 。 |
(?<=...) |
正向后行断言:匹配前面有某模式的字符串(ES2018)。 | /(?<=a)b/ 匹配 "ab" 中的 "b" ,但不匹配 "cb" 。 |
(?<!...) |
负向后行断言:匹配前面没有某模式的字符串(ES2018)。 | /(?<!a)b/ 匹配 "cb" 中的 "b" ,但不匹配 "ab" 。 |
要匹配上面这些字符本身,必须使用反斜杠来转义:
// 匹配第一个"bat"或"cat",忽略大小写
let pattern1 = /[bc]at/i;
// 匹配第一个"[bc]at",忽略大小写
let pattern2 = /\[bc\]at/i;
// 匹配所有以"at"结尾的三字符组合,忽略大小写
let pattern3 = /.at/gi;
// 匹配所有".at",忽略大小写
let pattern4 = /\.at/gi;
RegExp 构造函数
构造函数形式:
new RegExp(pattern, flags)
// 示例:
new RegExp('ab+c', 'i')
注意事项:
- 转义字符:构造函数中的模式需作为字符串传递,反斜杠需双重转义。
- 动态构建:构造函数适合动态生成正则表达式(如拼接变量)。
- 修饰符覆盖:若第一个参数是正则对象,第二个参数会覆盖其修饰符。
RegExp 实例属性
RegeExp 实例拥有提供有关模式各方面信息的属性。
修饰符相关(只读布尔值):
.global
(g):是否全局匹配。.ignoreCase
(i):是否忽略大小写。.multiline
(m):是否多行模式。.dotAll
(s):是否允许.匹配换行符(ES6+)。.unicode
(u):是否启用Unicode模式(ES6+)。.sticky
(y):是否粘性匹配(ES6+)。
其他属性:
.source
:正则表达式的模式文本(如/abc/
的 source 是 "abc")。.flags
:所有修饰符的字符串(如/abc/gi
的 flags 是 "gi")。.lastIndex
:下次匹配的起始位置(仅在 g 或 y 模式下生效)。
RegExp 实例方法
test()
检测字符串是否匹配,返回布尔值。
若正则启用 g/y
,每次调用会更新 .lastIndex
。
const regex = /a/g;
const str = 'abc';
regex.test(str); // true(lastIndex 变为 1)
regex.test(str); // false(从索引 1 开始无匹配,lastIndex 重置为 0)
exec()
返回匹配结果的数组(无匹配时返回 null
)。
- 数组包含完整匹配、捕获组、
index
(匹配位置)和input
(原始字符串)。 - 启用
g/y
时,重复调用可遍历所有匹配,因为每次匹配会从更新后的lastIndex
开始。
const regex = /a(b)(c)/d;
const result = regex.exec('abc');
console.log(result[0]); // 'abc'(完整匹配)
console.log(result[1]); // 'b'(第一个捕获组)
console.log(result.index); // 0(匹配位置)
console.log(result.indices); // [[0,3], [1,2], [2,3]](匹配的索引,需'd'标志)
RegExp 构造函数属性
RegExp 的静态属性,保存最近一次匹配的上下文(慎用,可能引发全局状态问题)。
每个属性都有一个全名和一个简写。常用属性:
RegExp.input
(RegExp.$_
):最近一次被匹配的字符串。RegExp.lastMatch
(RegExp['$&']
):最近一次匹配的文本。RegExp.lastParen
(RegExp['$+']
):最近一次匹配的最后一个捕获组。RegExp.leftContext
(RegExp['$
']`):匹配文本左侧的字符串。RegExp.rightContext
(RegExp["$'"]
):匹配文本右侧的字符串。RegExp.$1
~RegExp.$9
:第 1 到第 9 个捕获组的内容。
const regex = /(\d+)-(\d+)/;
regex.test('123-456');
console.log(RegExp.$1); // '123'
console.log(RegExp.lastMatch); // '123-456'
console.log(RegExp.leftContext); // ''(匹配在字符串开头)
RegExp 构造函数的所有属性都没有任何 Web 标准出处,因此不要在生产环境中使用它们。