复习:正则表达式
简单来说就是用一定的规则去查找、替换符合这个规则的文本。
JS中生成RegExp对象的两种方法
- RegExp 对象表示正则表达式。
- 修饰符 包含属性 “g”、”i” 和 “m”,分别用于指定 全局匹配、区分大小写的匹配和多行匹配
- 方法1:使用直接量的方式, 规则用
//
包裹起来,修饰符跟在后面:1
2
3const regexp1=/规则/修饰符;
// 例子: ^表示开头,g表示全局匹配。即:开头为a的字符串就满足这个正则表达式
const regexp1=/^a/g; - 方法2:使用构造函数RegExp的方式, 规则和修饰符都用引号包裹起来:
1
2
3const regexp2=new RegExp('规则','修饰符');
// 例子:
const regexp2=new RegExp('^a','g');1
2
3const regexp2=new RegExp(/规则/修饰符);
// 例子:
const regexp3=new RegExp(/^a/g);
正则方法
- 字符串的正则方法有:match()、replace()、search()、split()
- 正则对象的方法有:exec()、test()
- 注意区分match()和exec(),他们都是返回匹配结果的数组,但区别如下表:
match() | exec() |
---|---|
字符串的正则方法,使用字符串对象进行调用 | 正则对象的方法,使用RegExp对象进行调用 |
返回的是匹配完成后完整的数组 | 每调用一次返回单次对应的匹配结果并用数组的方式显示 |
- 区分
match()
和exec()
的例子:1
2
3
4
5
6
7
8
9
10const r1 = /imooc/g;
const str = "imoocimooc_imooc";
console.log(r1.exec(str));//["imooc", index: 0, input: "imoocimooc_imooc", groups: undefined]
console.log(r1.exec(str));//["imooc", index: 5, input: "imoocimooc_imooc", groups: undefined]
console.log(r1.exec(str));//["imooc", index: 11, input: "imoocimooc_imooc", groups: undefined]
console.log(r1.exec(str));//null
console.log(str.match(r1));//["imooc", "imooc", "imooc"]
match() 方法
- match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
- 该方法类似 indexOf() 和 lastIndexOf(),但是它**返回指定的值(数组)**,而不是字符串的位置。
- 返回值:存放匹配结果的数组。
- 语法:
1
2stringObject.match(searchvalue)
stringObject.match(regexp)
参数 | 描述 |
---|---|
searchvalue | 必需。规定要检索的字符串值。 |
regexp | 必需。规定要匹配的模式的 RegExp 对象。 如果该参数不是 RegExp 对象,则需要首先把它传递给 RegExp 构造函数,将其转换为 RegExp 对象。 |
- 例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15//^表示开头,g表示全局匹配。即:开头为"你"的字符串就满足这个正则表达式
const regexp1 = /^你/g;
console.log("你好呀你好呀你好呀".match(regexp1)); //["你"]
const regexp2 = new RegExp("^你好", "g"); //不要漏掉g的引号
console.log("你好呀你好呀你好呀".match(regexp2));//["你好"]
const regexp3 = new RegExp(/^我/g);
console.log("你好呀你好呀你好呀".match(regexp3));//null,不符合规则
const regexp4 = /你/g; //去掉^
console.log("你好呀你好呀你好呀".match(regexp4));//["你", "你", "你"]
const regexp5 = /你/; //去掉g,不再全局搜索
console.log("你好呀你好呀你好呀".match(regexp5));//["你"]
exec()方法
- exec() 方法用于使用正则表达式,检索字符串中的正则表达式的匹配。
- 语法:
RegExpObject.exec(要检索的字符串)
- 返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
- 与match()类似,他们都是返回匹配结果的数组,但match()是字符串的正则方法(是使用字符串对象进行调用),exec()是正则对象的方法(使用RegExp对象进行调用)。
- 例子:在下面y粘连修饰符的例子中使用。
test()方法
- test()方法用于检测一个字符串是否匹配某个模式.
- 返回值:布尔型。如果字符串中有匹配的值返回 true ,否则返回 false。
- 注意:和match()类似,不过他返回的是布尔值而不是匹配值构成的数组。
- 语法:
RegExp对象.test(要检测的字符串)
- 例子:在下面u修饰符的例子中使用。
正则表达式构造函数RegExp的变化
不管有多少个“原来的修饰符”,都会被“新增的修饰符”覆盖,注意:新增的修饰符需要引号
1 | const regexp = new RegExp(/规则/原来的修饰符,"新增的修饰符"); |
例子:
1 | const regexp = new RegExp(/^你/igm,"i");//最后生效的是i |
新增的u、y修饰符
u修饰符
- ES6 对正则表达式添加了 u 修饰符,含义为 “Unicode模式”,用来正确处理大于
\uFFFF
的Unicode字符。 - u修饰符的作用:使得要检测的字符串会被识别成一个字符而不是拆分成几个字符。使得可以正确处理四个字符的 UTF-16 编码
- 例子:
1
2
3
4//匹配开头为“\ud83d”的字符串,结果返回true,可是"\ud83d\udc36"是"🐶"
console.log(/^\ud83d/.test("\ud83d\udc36"));//true
//加上u修饰符:
console.log(/^\ud83d/u.test("\ud83d\udc36"));//false - 例子分析:
- 上面代码中,
\ud83d\udc36
是一个四字节的UTF-16 编码,代表一个字符小狗”🐶” - 但是,ES5不支持四个字节的 UTF-16 编码,会将其识别为两个字符,导致第一行代码结果为 true。
- 加了u修饰符以后,ES6就会识别其为一个字符,所以第二行代码结果为false。
- 上面代码中,
y 粘连修饰符
- y即 sticky(adj. 粘的;粘性的)
- y修饰符和g修饰符很像,他们都是全局匹配的,但y修饰符需要匹配到的第1个和第2个规则直接相粘连才能匹配到第2个,第一个匹配结束以后如果不是马上遇到第2个就停止匹配,返回null。
- 例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15const r1 = /imooc/g;
const r2 = /imooc/y;
const str = "imoocimooc_imooc";
console.log(r1.exec(str)); // ['imooc', index: 0, input: 'imoocimooc_imooc', groups: undefined]
console.log(r1.exec(str)); // ['imooc', index: 5, input: 'imoocimooc_imooc', groups: undefined]
console.log(r1.exec(str)); // ['imooc', index: 11, input: 'imoocimooc_imooc', groups: undefined]
console.log(r1.exec(str)); // null
console.log("-----------我是分割线-------------");
console.log(r2.exec(str)); // ['imooc', index: 0, input: 'imoocimooc_imooc', groups: undefined]
console.log(r2.exec(str)); // ['imooc', index: 5, input: 'imoocimooc_imooc', groups: undefined]
console.log(r2.exec(str)); // null - 例子分析:
- 可以看到全局匹配则可以的到3个“imooc”,而使用y(粘连修饰符)只能匹配到2个“imooc”。
- 这是因为y需要匹配到的第一个和第二个规则直接相粘连才能匹配到第2个,在这个例子中第二个“imooc”匹配完以后出现了
-
于是就停止匹配了。