前言
正则表达式(Regular Expression)是一个描述字符模式的对象,具有强大的模式匹配和文本检索与替换功能。
一、创建方法
//1、字面量创建法
var reg = /a/g;
//2、构造函数创建法
var reg = new RegExp('a','g');
//其中a是元字符,g是修饰符,在后文会详细介绍。
二、常用修饰符
| 修饰符 | 含义 |
|---|---|
| i | 不区分大小写 |
| g | 全局查找(找到所有的匹配,而不是在找到第一个匹配字符后就停止) |
| m | 多行匹配 |
三、正则表达式的属性和方法
1、属性: source 和 flags
var reg = /a/g;
console.log(reg.source);//a - 元字符
console.log(reg.flags);//g - 修饰符
// 应用:复制正则表达式
var reg = /a/g;
var reg1 = new RegExp(reg.source, reg.flags);
console.log(reg1 === reg); //false 两者都是对象,所以不相等
2、方法
(1)reg.test(str)
test:判断字符串中是否有符合正则规则的字符, 如果有就返回true, 否则返回false
var reg = /a/g;
console.log(reg.test('abcd')); //true
console.log(reg.test('ABCD')); //false
//补充: 判断字符串中是否有某个字符的两种方法
//例子 判断str中是否有a
var str = 'abcd'
if (/a/.test(str)) {
//方法一
};
if (str.indexOf('a') > -1) {
//方法二
};
(2)reg.exec(str)
exec: 在字符串中寻找正则规则的字符, 返回一个数组 (用得不多)
1)如果没找到返回null;
2)如果找到了返回该字符数组 (只能找到第一个)
var reg = /b/gi;
console.log(reg.exec("ABCabc"));
// ["B", index: 1, input: "ABCabc", groups: undefined]
// "B" --> 目标查找的元素
// index --> 索引下标index
// input --> 查找的字符
// groups --> 群组group
四、字符串相关方法
| 方法 | 重要程度 |
|---|---|
| str.search( ) | ☆ |
| str.split( ) | ☆☆ |
| str.replace( ) | ☆☆☆ |
| str.match( ) | ☆☆☆☆ |
search 查找
按照正则的规则查找字符
返回找到的第一个满足规则的元素下标,不能全局查找
与indexOf方法相似
var str = "ab12ca3d4eA2f4g";
console.log(str.search(/[0-9]/));//2 查找出现的第一个数字的索引
console.log(str.indexOf("1")); //2 查找第一次出现1时的索引
split 切割
按照正则表达式匹配内容,切割后返回数组
var str = "ab12ca3d4e";
var arr = str.split("2"); //用数字2切割 ["ab1", "ca3d4e"]
arr = str.split(/[0-9]/); //用任意1个数字切割 ["ab", "", "ca", "d", "e"]
arr = str.split(/[0-9]+/); //用任意个数字切割 ["ab", "ca", "d", "e"]
str = str.split(/[0-9]+/).join(""); //相当于把所有数字删除
console.log(arr,str);
var str = 'abcdefg'; //用c或者f切割
console.log(str.split(/[cf]/g));//可以省略g,因为split默认是全局查找['ab','de','g']
replace 替换
参数类型一:
str.replace(正则,要替换的内容)
参数类型二:
str.replace(正则,回调函数(item,index){
return 返回要替换的内容
})
// 这里的回调函数类似数组遍历,可以return也可以不return
// 1)普通参数
var str = "ab12ca3d4eA2f4g";
// 通过正则修饰符 全局替换所有满足规则的字符
str = str.replace(/a/gi, "z"); // 把所有的a换成z
str = str.replace(/[df]/ig, "z"); // 将字符d或者f替换成z
str = str.replace(/[0-9]/ig, ""); // 删除所有数字
// 2)第二个参数传入函数
// 例2.1 第一个a替换成x 其他的a替换成y
var str = 'abcadeafgh';
str = str.replace(/a/g, function (item, index) {
return index === 0 ? 'x' : 'y';
})
console.log(str);
// 例2.2 查找所有a字符的下标
var str = 'abcdeafgh';
var arr = [];
str.replace(/a/g, function (item, index) {
// 把符合规则的index放入数组中
arr.push(index);
})
console.log(arr);
// (把不同的内容的替换成同一个内容)
// 例2.3 把所有的a或c或e替换成0
var str = 'abcdeafgh';
str = str.replace(/[ace]/g, '0');
console.log(str);
//(把不同的内容换成不同的内容)
// 例子2.4:把英文字符替换成数字
var str = "ab78Ca9d";
var num = 0;
// [a-z]是替换单个元素 [a-z]+是可以替换多个元素成1个元素
str = str.replace(/[a-z]/gi, function (item, index) {
return ++num;
})
console.log(str);//'12783495'
// 例子2.5 把所有的a替换成1,把所有b替换成2,把所有c替换成3
var str = 'abcdeabcfgabc';
str = str.replace(/[abc]/g, function (item) {
switch (item) {
case 'a': return '1';
case 'b': return '2';
case 'c': return '3';
}
})
match 查找
查找到符合规则的字符 -- [返回数组]
a. 如果添加全局g,会返回找到的所有元素组成的数组
b. 如果没有全局g,且没有加[群组]效果与exec一致
c. 如果没有全局g,且加了[群组],返回一个数组(第0个元素是查找到的字符,往后的元素是找到的符合群组规则的元素+input等内容)
var str = "ab12ca3d4eA2f4g";
console.log(str.match(/a/i)); // (类型b)没有增加修饰符: 效果与exec相同
//["a", index: 0, input: "ab12ca3d4eA2f4g", groups: undefined]
console.log(str.match(/a/gi));// (类型a)增加修饰符g: 以数组的形式罗列出来查找到的内容
//["a", "a", "A"]
// 只要添加了全局g,返回的就是找到的元素组成的数组
console.log(str.match(/2([a-z])/g));// (类型a)查找开头是2,后面紧跟一个字母的字符,可以找出全部,并且以数组展示
//["2c", "2f"]
console.log(str.match(/2([a-z])/));// (类型c)查找开头是2,后面紧跟一个字母的字符(2c 2f),只能找出第一个
//["2c", "c", index: 3, input: "ab12ca3d4eA2f4g", groups: undefined]
console.log(str.match(/(2)([a-z])/));//c如果使用群组,match还可以区分群
//["2c", "2", "c", index: 3, input: "ab12ca3d4eA2f4g", groups: undefined]
// 例子加深理解群组()的作用 ()和全局g两者不可兼得 ————————————
var str = "中国有四大名著,分别是<西游记>、<水浒传>、<红楼梦>、<三国演义>,他们都是经典小说";
// a. 全局查找'<书名>'
console.log(str.match(/\<.*?\>/g)); //["<西游记>", "<水浒传>", "<红楼梦>", "<三国演义>"]
// b. 虽然加了(),但是和a的效果相同,因为有全局g,()失效 无法实现不能只要书名不要书名号
console.log(str.match(/\<(.*?)\>/g)); // ["<西游记>", "<水浒传>", "<红楼梦>", "<三国演义>"]
// c. 只要书名不要书名号,但是只能获取到第一个'西游记',因为没有g
console.log(str.match(/\<(.*?)\>/)[1]); //'西游记'
// 对比例子
// a.无群组,有全局g,返回找到的数组
console.log('12abc34ab56'.match(/[a-z]+\d+/g)); //["abc34", "ab56"]
// b.有群组,又有全局查找g,()群组失效,故和例a等效
console.log('12abc34ab56'.match(/[a-z]+(\d+)/g));//["abc34", "ab56"]
// c.有群组,且没有全局g,只得到括号里的数字
console.log('12abc34ab56'.match(/[a-z]+(\d+)/)[1]);//34
//["abc34", "34", index: 2, input: "12abc34ab56", groups: undefined]
元字符
| 字符 | 含义 | 备注 |
|---|---|---|
| . | 代表任意一个字符 |
元字符放在[]内会失效,[.]代表.本身,不再代表任意字符 |
| ^ | 匹配输入字符串的开始位置 | 其他含义 ^在[]内第一位: 表示反义符 ^在[]内非第一位: 表示^字符本身 |
| $ | 匹配输入字符串的结束位置 | |
| {n} | 匹配确定的 n 次 | abc{2} 代表c重复2次,不是abc重复两次 =>注意与[^abc]的区别,代表非abc |
| {n,} | 至少匹配n 次 | 默认贪婪匹配 |
| {n,m} | 最少匹配 n 次且最多匹配 m 次 | 默认贪婪匹配 |
| * | 等价于{0,} | 匹配0次或多次 |
| + | 等价于{1,} | 匹配1次或多次 |
| ? | 等价于{0,1} | 匹配0次或1次 |
| ? | 紧跟在其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,代表非贪婪匹配 | |
| x|y | 匹配 x 或 y | 例如,'z|food' 指匹配 "z" 或 "food; '(z|f)ood' 指匹配 "zood" 或 "food" |
| [xyz] | 字符集合,匹配所包含的任意一个字符 | []中括号里的内容可以匹配任意[一个]内容 |
| [^xyz] | 匹配未包含的任意字符 | 表示(非x 非y 非z),而不是(非x、y、z) ^在[]内第一位: 表示反义符 ^在[]内非第一位: 表示^字符本身 |
| [a-z] | ||
| \d | ||
| \D | ||
| \w | 数字字母下划线,等价于'[A-Za-z0-9_]' | |
| \W | 非数字字母下划线,等价于 '[^A-Za-z0-9_]' | |