1. 正则创建
1-1. 方式一:字面量创建
\正则表达式\
let str = "andhhasdjh125563jkhh";
let reg = /\d+/;
let result = str.match(reg);
console.log(result);
>["125563", index: 10, input: "andhhasdjh125563jkhh", groups: undefined]
1-2. 方式二:构造函数创建
- 加引号 —— " "
- 若正则表达式中存在"",需要加转义字符""
let str = "andhhasdjh125563jkhh";
let reg = new RegExp("\\d+");
let result = str.match(reg);
console.log(result);
>["125563", index: 10, input: "andhhasdjh125563jkhh", groups: undefined]
1-3. 全局匹配 — g
- 方式一的全局匹配格式
let str = "hhasdjh125563jkhh888llg";
let reg = /\d+/g;
let result = str.match(reg);
console.log(result);
>(2) ["125563", "888"]
- 方式二的全局匹配格式
let str = "hhasdjh125563jkhh888llg";
let reg = new RegExp("\\d+","g");
let result = str.match(reg);
console.log(result);
>(2) ["125563", "888"]
1-4. 创建方式的选取
- 一般情况下由于第一种方式的简单快捷,直接选取第一种方式
- 当表达式是一个变量时,只能采用第二种方式
let str = "andhhasdjh125563jkhh";
let exp = "hasd";
let reg = new RegExp(exp);
let result = str.match(reg);
console.log(result);
>["hasd", index: 4, input: "andhhasdjh125563jkhh", groups: undefined]
2. 正则方法 — Reg.function()
2-1. test()
- 测试是否有值满足正则表达式
- 返回值为true、false
let str="sjh5932jiui8943";
let reg = /\d+/;
let res = reg.test(str);
console.log(res);
>true
2-2. exec()
- 用于检索字符串中的正则表达式的匹配
- 返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null
let str="sjh5932jiui8943";
let reg = /\d+/;
let res = reg.exec(str);
console.log(res);
>["5932", index: 3, input: "sjh5932jiui8943", groups: undefined]
- 若为全局匹配,则可以反复调用 exec() 方法来遍历字符串中的所有匹配文本
let str = "sjh5932jiui8943";
let reg = /\d+/g;
let res = reg.exec(str);
console.log(res);
let res1 = reg.exec(str);
console.log(res1);
let res2 = reg.exec(str);
console.log(res2);
>["5932", index: 3, input: "sjh5932jiui8943", groups: undefined]
>["8943", index: 11, input: "sjh5932jiui8943", groups: undefined]
>null
3. 字符串方法 — String.function()
3-1. split()
- 根据正则表达式分割字符串
// 根据数字分割字符串
let str = "sjh5932jiui8943iishj";
let reg = /\d+/;
let res = str.split(reg);
console.log(res);
>(3) ["sjh", "jiui", "iishj"]
3-2. replace()
- 根据正则表达式替换字符串
// 敏感词过滤
let str = "据中国教育部数据显示,2007年至2018年,中国出国留学人数由14万增至66.2万,年均增长约14%;而同期的留学归国人数由4万增至51.9万,年均增长近24%。归国热潮下,海归就业的供需市场如何,成为留学人员与国内用人单位的共同关注。";
let reg = /教育部|人员/g;
let res = str.replace(reg,function(arg){
// arg:匹配到的字符串
console.log(arg);
return "*".repeat(arg.length)
})
console.log(res)
>据中国***数据显示,2007年至2018年,中国出国留学人数由14万增至66.2万,年均增长约14%;而同期的留学归国人数由4万增至51.9万,年均增长近24%。归国热潮下,海归就业的供需市场如何,成为留学**与国内用人单位的共同关注。
3-3. search()
- 根据正则表达式匹配第一个符合结果的索引值位置; 如果找不到,则返回 -1
- 会忽略全局匹配
let str = "jui785pok863usn";
let reg = /\d+/;
let res = str.search(reg);
console.log(res)
>3
3-4. match()
- 根据正则表达式返回符合要求的字符串
- 若非全局匹配,则只返回第一个符合要求的结果且描述详细
let str = "jui785pok863usn";
let reg = /\d+/;
let res = str.match(reg);
console.log(res)
>["785", index: 3, input: "jui785pok863usn", groups: undefined]
- 若是全局匹配,则返回所有符合要求但描述不详细
let str = "jui785pok863usn";
let reg = /\d+/g;
let res = str.match(reg);
console.log(res)
>(2) ["785", "863"]
4. 元字符
- 正则中有特殊含义的非字母字符
. * + ? $ ^ | \ () [] {}
4-1. \
- 转义字符,将特殊含义转换成字面量含义
4-2. *
- 匹配前面的子表达式0次或多次
4-3. +
- 匹配前面的子表达式1次或多次
4-4. .
- 匹配除了 \n \r \u2028 或 \u2029 以外的所有字符
let str = `<div>some value..</div>`;
let reg = /<div>.*<\/div>/g;
let res = reg.test(str);
console.log(res);
>true
4-5. \w
- \w 元字符用于查找单词字符
- 单词字符包括:a-z、A-Z、0-9,以及下划线, 包含 _ (下划线) 字符
4-6. ^表达式$
^
:匹配输入字行首$
:匹配输入行尾
let str = "cde__111fg";
let reg = /^c\w+g$/g;
let res = reg.test(str);
console.log(res);
>true
4-7. []
- 表示字符集合
[ab]
:表示匹配a或者b
let str = "dffdabfds123fdabfdb435afdsa";
let reg = /[ab]/g;
let res = str.replace(reg, "*");
console.log(res);
dffd**fds123fd**fd*435*fds*
[^ab]
:表示匹配非a或者非b
let str = "dffdabfds123fdabfdb435afdsa";
let reg = /[^ab]/g;
let res = str.replace(reg, "*");
console.log(res);
>****ab********ab**b***a***a
[0-9]+
:等同于\d+
let str = "dffdabfds123fdabfdb435afdsa";
let reg = /[0-9]/g;
let res = str.replace(reg, "*")
console.log(res);
>dffdabfds***fdabfdb***afdsa
4-8. \b
- 边界符,匹配一个零宽单词边界
- 非
\w
都被称为边界
let str = "is this a book?";
let reg = /\bis\b/g;
// let reg = new RegExp("\\bis\\b","g");
let arr = str.match(reg);
console.log(arr);
>["is"]
4-9. {n}
- 匹配确定的n次
?
相当于{0,1}
+
相当于{1,}
*
相当于{0,}
let str = "is this a book?";
let reg = /o{2}/g;
let arr = str.replace(reg, "*");
console.log(arr);
>is this a b*k?
4-10. ()
-
分组
-
替换abab
let str = "abab";
let reg = /ab{2}/g;
let arr = reg.test(str);
console.log(arr);
>false
- 未成功替换,因为
/ab{2}/
匹配的是abb - 修改成
/(ab){2}/g
,替换成功
let str = "abab";
let reg = /(ab){2}/g;
let arr = reg.test(str);
console.log(arr);
>true
4-11. 反向引用—建立在分组的基础上
$n
代表第n个分组
let time = "2020-09-30";
let reg = /(\d{4})-\d{2}-\d{2}/g;
let res = reg.exec(time)
console.log(RegExp.$1)
>2020
- 转换时间格式:2019-10-19 — 19/10/2019
let time = "2020-09-30";
let reg = /(\d{4})-(\d{2})-(\d{2})/g;
let res = time.replace(reg, "$3/$2/$1")
console.log(res);
>30/09/2020
4-12. 命名分组:?<分组名>
- ES2018新增特性
let str = "$name=zhangsan&age=20";
let reg = /\$(?<str>\w+)/;
let res = str.match(reg);
console.log(res);
>(2) ["$name", "name", index: 0, input: "$name=zhangsan&age=20", groups: {…}]
0: "$name"
1: "name"
>groups: {str: "name"}
index: 0
input: "$name=zhangsan&age=20"
length: 2
>__proto__: Array(0)
console.log(res.groups.str)
>name
4-13. 零宽断言
- ES2018新增
- 断言后边-正向肯定断言:
/(?=表达式)/
// iphone换成苹果
let str = "iphone3iphone4iphone11iphoneNumber";
let reg = /iphone(?=\d{1,2})/g;
let res = str.replace(reg, "苹果");
console.log(res);
>苹果3苹果4苹果11iphoneNumber
- 断言后边-正向否定断言 :
/(?!表达式)/
// iphone换成苹果
let str = "iphone_iphone3iphone4iphone11iphoneNumber";
// 即匹配后边表达式不是\d{1,2}的iphone
let reg = /iphone(?!\d{1,2})/g;
let res = str.replace(reg, "苹果");
console.log(res);
>苹果_iphone3iphone4iphone11苹果Number
- 断言前边-负向肯定断言:
/(?<=表达式)/
let str = "10px20px30pxipx";
let reg = /(?<=\d{2})px/g;
let res = str.replace(reg, "像素");
console.log(res);
>10像素20像素30像素ipx
- 断言前边-负向否定断言
let str = "10px20px30pxipx";
let reg = /(?<!\d{2})px/g;
let res = str.replace(reg, "像素");
console.log(res);
>10px20px30pxi像素
5. 匹配模式
5-1. g
- global,全局模式:找到所有匹配,而不是在第一个匹配后停止
5-2. i
- ignore,忽略大小写模式:匹配不区分大小写
- 未加
i
时
let str = "aAAaaaAAA";
let reg = /a/g;
let res = str.replace(reg, "*");
console.log(res);
>*AA***AAA
- 加
i
后
let str = "aAAaaaAAA";
let reg = /a/gi;
let res = str.replace(reg, "*");
console.log(res);
>*********
5-3. m
- multiple,多行模式:将开始和结束字符(^和$)视为在多行上工作,而不只是匹配整个输入字符串的最开始和最末尾处
- 未加
m
时
let str = `sjkjf
lajsd`;
let reg = /^\w/g;
let res = str.replace(reg, "*");
console.log(res);
>*jkjf
lajsd
- 加
m
后
let str = `sjkjf
lajsd`;
let reg = /^\w/gm;
let res = str.replace(reg, "*");
console.log(res);
>*jkjf
*ajsd
5-4. s
- dotAll / singleline模式:. 可以匹配换行符
- 未加
s
时
let str = `<div>some
value..</div>`;
let reg = /<div>.*<\/div>/g;
let res = reg.test(str);
console.log(res);
>false
- 加
s
后
let str = `<div>some
value..</div>`;
let reg = /<div>.*<\/div>/gs;
let res = reg.test(str);
console.log(res);
>true
5-5. y
- sticky,粘性模式:匹配正则中lastIndex属性指定位置的字符,并且如果没有匹配也不尝试从任何后续的索引中进行匹配
let str = "53789dhjsh789jisjk";
let reg = /\d+/gy;
console.log(reg.exec(str));
console.log(reg.exec(str));
>["53789", index: 0, input: "53789dhjsh789jisjk", groups: undefined]
>null
let str = "53789dhjsh789jisjk";
let reg = /\d+/g;
console.log(reg.exec(str));
console.log(reg.exec(str));
>["53789", index: 0, input: "53789dhjsh789jisjk", groups: undefined]
>["789", index: 10, input: "53789dhjsh789jisjk", groups: undefined]
let str = "p53789dhjsh789jisjk";
let reg = /\d+/gy;
console.log(reg.exec(str));
console.log(reg.exec(str));
>null
>null
6. 正则工具
- http://regexper.com