概念
-
正则表达式:Regular Expression,是由一个字符序列形成的搜索模式
-
JavaScript 中使用 RegExp 对象表示正则表达式,其中预定义了正则相关的属性和方法
-
JavaScript 中声明正则表达式的方式
// 字面量声明(直接量声明) let reg1 = /abcde/i // new 声明 let reg2 = new RegExp('abcde', 'i') // 正则表达式主体 abcde // 可选的修饰符 i
语法
修饰符
非全局匹配默认在第一个匹配后停止
| 修饰符 | 描述 |
|---|---|
| i | 忽略大小写 |
| g | 全局匹配 |
| m | 多行匹配 |
方括号
[A-Za-z] 可写作 [A-z]
| 方括号 | 描述 |
|---|---|
| [abc] | 查找方括号之间的任何字符 |
| [^abc] | 查找任何不在方括号之间的字符 |
| [0-9] | 查找任何从 0 至 9 的数字 |
| [a-z] | 查找任何从小写 a 到小写 z 的字符,也有 [A-Z]、[A-Za-z]、[A-z] |
元字符
元字符是正则表达式中特殊的转义字符
| 元字符 | 描述 |
|---|---|
| \w | 查找数字、字母及下划线,与 \W 相反 |
| \d | 查找数字,与 \D 相反 |
| \s | 查找空白字符,与 \S 相反 |
| \b | 匹配单词边界,与 \B 相反 |
| . | 查找单个字符,除了换行和回车 |
量词
正则的贪婪模式:尽量匹配更多的字符
可以在代表数量的标示符后放置
?来开启非贪婪模式
| 量词 | 描述 |
|---|---|
| n+ | 匹配任何包含至少一个 n 的字符串 |
| n* | 匹配任何包含零个或多个 n 的字符串 |
| n? | 匹配任何包含零个或一个 n 的字符串 |
| n{x} | 匹配包含 x 个 n 的序列的字符串 |
| n{x,} | 匹配至少包含 x 个 n 的序列的字符串 |
| n{x,y} | 匹配包含 x 到 y 个 n 的序列的字符串 |
| n$ | 匹配任何结尾为 n 的字符串 |
| ^n | 匹配任何开头为 n 的字符串 |
| (?=n) | 匹配任何其后紧接指定字符串 n 的字符串 |
| (?!n) | 匹配任何其后没有紧接指定字符串 n 的字符串 |
正则方法
正则对象方法
-
test
判断模式与字符串是否匹配
const reg = /abc/; const res = reg.test('abcd'); // true -
exec
const reg = /\w/g; const str = 'abcd'; const res = reg.exec('abcd'); // 多次执行时返回: // a // b // c // d // null // a // ...当正则为全局匹配时,多次执行 exec 将会从前往后的返回新的匹配内容
当正则为非全局匹配时,exec 将一直返回第一次匹配的内容
字符串方法
-
search
检索与正则表达式相匹配的子字符串,返回开头索引
如果没有找到任何匹配的子串,则返回 -1
const str ="abcdfg"; const res = str.search(/cd/); // 2 -
match
检索一个或多个正则表达式的匹配
const str ="aaabbb"; const res = str.search(/a/g); // ['a', 'a', 'a'] -
split
在正则表达式的匹配处分割字符串
const str = 'a-b_c'; const res = str.split(/-|_/); // 匹配 - 或 _ // ['a', 'b', 'c'] -
replace
替换一个或多个与正则表达式匹配的子串
const str = '我是{{name}},正在学习{{study}}'; const data = {name: 'Cade', study: '正则表达式'}; str.replace(/{{(\w+)}}/g, (matched, group1, index, origin) => { return data[group1]; }); // '我是Cade,正在学习正则表达式'
反向引用
使用一对小括号包裹正则表达式的部分,称为一个分组。可以通过/加序号的方式进行引用
const reg = /(\w)\1(\w)\2/g;
const str = 'aaabbbccddd';
const res = str.match(reg);
// ['aabb', 'ccdd']
反向引用具有记忆性,对(\w)的反向引用,不仅仅要求是\w,还需要和被引用的分组匹配的内容一致
正向预查
使用(?=exp)表示匹配任何其后紧接指定表达式的字符串,在正则表达式中称为断言
一对小括号表示分组,又(?=exp)并不包含在匹配结果里,因此称为不捕获组
正向预查使用示例:将数字按千分制表示
// 12345678 -> 12,345,678
const str = '12345678';
// 以查找 1 到 3 位子串为准,检测其后到结束的数字个数是否为 3 的整数倍
const reg1 = /(\d{1,3})(?=(\d{3})+$)/g;
const str1 = str.replace(reg1, '$1,');
// 多次断言,以查找空位为准,用 (?!^) 去掉开头的空位
const reg2 = /(?=(\d{3})+$)(?!^)g;
const str2 = str.replace(reg1, ','); // 将空位替换为逗号