正则表达式
1. 正则表达式字符匹配攻略
1.1 两种模糊匹配
- 横向模糊匹配
const reg = /ab{1,3}c/g; //第一个查找a,第二个查找1到3个b,第三个查找c。 全局查找
const str = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";
console.log(str.match(reg));
// abc abbc abbbc
- 纵向模糊匹配
const reg = /a[123]c/g; //第一个查找a,第二个查找1或2或3,第三个查找c。 全局查找
const str = "a1c a2c a3c a4c a5c";
console.log(str.match(reg));
// a1c a2c a3c
1.2 字符组
虽然叫字符组,但只是其中的一个字符。
例如[abc],表示匹配一个字符,可以是a或b或c。
如果想查找全部大写字母,可以使用[A-Z]。
如果是排除某个字符,则可以使用[^abc]。表示排除a,b,c三个字符。
当然也有一些简写显示
| 简写 | 含义 |
|---|---|
\d | 表示[0-9]。表示一位数字 |
\D | 表示[^0-9]。表示除数字外任意字符 |
\w | 表示 [0-9a-zA-Z_]。表示数字、大小写字母和下划线。 |
\W | 表示 [^0-9a-zA-Z_]。非单词字符。 |
\s | 表示 [ \t\v\n\r\f]。表示空白符,包括空格、水平制表符、垂直制表符、换行符、回车符、换页符。 |
\S | 表示 [^ \t\v\n\r\f]。 非空白符。 |
. | 所有字符 |
1.3 量词
{m,n}表示前面的字符或字符组出现m或n次。
简写形式
| 简写 | 含义 |
|---|---|
* | 等价于{0,},表示前面的字符或字符组出现0次或多次。 |
+ | 等价于{1,},表示前面的字符或字符组出现1次或多次。 |
? | 等价于{0,1}表,示前面的字符或字符组出现0次或1次。 |
{m} | 表示前面的字符或字符组出现m次。 |
{m,} | 表示前面的字符或字符组出现m次或多次。 |
例如:RegExp: /a{1,2}b{3,}c{4}d?e+f*/
表示:a字符出现1次或2次,b字符出现3次或多次,c字符出现4次,d字符出现0次或1次,e字符出现1次或多次,f字符出现0次或多次。
贪婪匹配与惰性匹配
- 贪婪匹配:尽可能多的匹配
- 惰性匹配:尽可能少的匹配
默认情况下是贪婪匹配,在量词后面加个?就能实现惰性匹配。
1.4 多选分支
|表示多选分支,多选分支中的内容,只要匹配一个就可以。
例如:RegExp: /abc|def|ghi/
表示:匹配abc、def或ghi中的任意一个。
多选分支是惰性的,前面的匹配到了,后面的就不再尝试了。
2. 正则表达式位置匹配攻略
位置的概念:相邻字符之间的位置,包括行头和行尾。位置可以理解为空字符""
^(脱字符)匹配开头,在多行匹配中匹配行开头。
$(美元符号)匹配结尾,在多行匹配中匹配行结尾。
例子:
const reg = /^|$/g;
const str = "abc a123 a!";
console.log(str.replace(reg,'#'));
// #abc a123 a!#
多行匹配模式m。
const reg = /^|$/gm;
const str = "abc\n a123 a!";
console.log(str.replace(reg,'#'));
// #abc#
// #a123 a!#
\b是单词边界,具体就是\w和\W之间的位置。通俗来说就是字符或数字与非字符或数字之间的位置。
\B就是\b的反义词,非单词边界。
const reg = /\b/g;
const reg1 = /\B/g;
const str = "abc a123 a!";
console.log(str.replace(reg,'#'));
// #abc# #a123# #a#!
console.log(str.replace(reg1,'#'));
// a#b#c a#1#2#3 a!#
-
(?=p)是正向先行断言,具体就是p前面的位置。 -
(?!p)是负向后发断言,是正向先行断言的方面意思。
var result = "hello".replace(/(?=l)/g, '#');
console.log(result);
// => "he#l#lo"
var result1 = "hello".replace(/(?!l)/g, '#');
console.log(result1);
// => "#h#ell#o#"
案例:数字的千分位分隔符表示法
const reg = /(?!^)(?=(\d{3})+$)/g;
const str = "1234567890";
console.log(str.replace(reg,','));
// 1,234,567,890
解释:^表示匹配开头,(?!^)排除开头的位置,(\d{3})表示匹配三个数字,?=(\d{3})表示匹配三个数字前面的位置,+表示匹配三个数字前面的位置1次或多次,$表示匹配结尾,
3. 正则表达式括号的作用
括号的作用:分组,记忆,截取。
- 分组
- 分支结构
替换
想把日期的yyyy-mm-dd格式替换成mm/dd/yyyy格式,
const reg = /(\d{4})-(\d{2})-(\d{2})/g;
const str = "2020-01-01";
console.log(str.match(reg));
// ["2020-01-01", "2020", "01", "01"]
console.log(str.replace(reg, '$2/$3/$1'));
// 01/01/2020
replace中的第二个参数里用2、$3表示分组捕获的内容。
反向引用
\1表示第一个分组捕获的内容,\2表示第二个分组捕获的内容。
如果遇到嵌套的括号,则从外内里分组,从左到右分组。
如果引用了不存在的分组,不会报错,只是匹配反向引用字符本身。