正则表达式
是由普通字符及特殊字符(元字符)组成的对字符串进行过滤的逻辑公式。
正则表达式图形化工具
https://regexper.com/
正则表达式的创建
1、字面量
// 以/斜杆开始和结束,中间部分为需要匹配的字符串
var reg = /abc/;
2、构造函数
// 构造函数中第一个参数为需要匹配的字符串
var reg1 = new RegExp("abc");
正则表达式的方法
1、test()是正则表达式的方法
返回一个布尔值,如果要检测是字符串(test参数)中含有某个子串(正则定义),返回true
var reg = /study1/i; //字面量方式,在最右加i,表示不区分大小写
console.log(reg.test("sTuDy111")); //true
var reg = new RegExp("STUdy","i"); //构造函数方式不区分大小写,把i作为第二个参数
console.log(reg.test("asstudyy")); //true
2、exec()方法,返回一个伪数组,将匹配成功的内容返回
如果没有匹配,返回null
var reg = /day/i;
console.log(
reg.exec("good good study, Day Day up")
//返回的类数组对象中的index表示匹配的子串在字符串中的位置
);
//["Day", index: 17, input: "good good study, Day Day up", groups: undefined]
//字母g 表示在匹配内容时,全局搜索
//在使用exec方法时,正则表达式不是全局匹配,则每次从0位置开始
var reg = /day/ig;
console.log(reg.exec("day aday up"));
// ["day", index: 0, input: "day aday up", groups: undefined]
console.log(reg.exec("day aday up"));
// ["day", index: 5, input: "day aday up", groups: undefined]
console.log(reg.exec("day aday up"));
// null
字符串中的方法
1、replace(),替换
var str = "google tbc goole Tmd TMD abc tmd";
var reg= new RegExp("tmd","ig");
console.log(str.replace(reg,"*"));//用*号去替换正则表达式匹配到的内容(子串)
// google tbc goole * * abc *
2、match(),将匹配到的结果都放入数组中,并返回
var pattern = /good/ig;
var str = 'Good good GOoD study!,day day up!';
var arr = str.match(pattern); //将匹配到的结果都放入数组当中,并返回
console.log(arr);
// ["Good", "good", "GOoD"]
match方法如果全局搜索时,返回的是数组,数组中的元素值为匹配到的字符。
如果不是全局搜索,返回的内容与exec方法返回值类似。
var pattern = /good/i;
var str = 'Good good GOoD study!,day day up!';
var arr = str.match(pattern); //将匹配到的结果都放入数组当中,并返回
console.log(arr);
// ["Good", index: 0, input: "Good good GOoD study!,day day up!", groups: undefined]
3、search()方法,查找符合正则的子串的位置,只返回第一个匹配的位置索引
var pattern = /good/ig;
var str = 'aGood good good study!,day day up!';
console.log(str.search(pattern));
// 1
4、split()方法,分割,返回的是数组
var str = 'Gxxd good study! day day up!';
console.log(str.split(/g..d/i));
// ["", " ", " study! day day up!"]
元字符
1、 .元字符,代表除换行之外的所有单个字符
var reg = /g..gle/ig;
var str = "gooaggleg-ggle";
console.log(reg.test(str)); // true
console.log(str.match(reg)); // ["g-ggle"]
// 注,match方法全局搜索时,返回的是数组,即使只有一个元素也是数组
2、 *元字符,重复前的单个字符的(0-n)次匹配
var reg = /aa.*gle/ig;
var str = "bbaaglecc";
console.log(reg.test(str)); // true
console.log(str.match(reg)); //["aagle"]
// *前面的是.即任意单个字符,可有0个或多个
3、 +元字符,+前的单个字符至少一次匹配
var reg = /aa.+gle/ig;
var str = "bbaaglecc";
console.log(reg.test(str)); // false
console.log(str.match(reg)); //null
// +前面的是.即任意单个字符,+前的单个字符至少一次匹配
4、 ?元字符,?前的单个字符出现0-1次,(贪婪匹配),如果有就匹配上
var reg = /g?gle/ig;
var str = "g?ggle";
console.log(reg.test(str)); // true
console.log(str.match(reg)); // ["ggle"]
// ?前面的是g,出现0次或1次,即gle或ggle都可匹配
// 正则为贪婪匹配,即尽可能多的匹配字符
5、 \转义字符,将特殊字符当做普通字符看待
var str = "abc\\nss";
// 原本\n会打印换行,此时在\n前加了转义字符,就变成了普通字符打印
console.log(str); //abc\nss
6、 []表示字符可以出现的范围,如[a-z]
var reg = /g[0-9a-zA-Z_]+gle/g;
var str = "agglegle";
console.log(reg.test(str)); // true
console.log(str.match(reg)); // ["gglegle"]
7、 \w 等价于[a-zA-Z0-9_] //字母数字下划线
\W 非字母数字下划线
var reg = /a\wc/g;
var str = "awwwwcabc";
console.log(reg.test(str)); // true
console.log(str.match(reg)); // ["abc"]
8、 \d 等价于[0-9] //数字
\D{7,}匹配至少 7个非数字(相当于[^0-9]{7,})
var reg = /g\d+g/g;
var str = "gg01243gle";
console.log(reg.test(str)); // true
console.log(str.match(reg)); // ["g01243g"]
9、 /^ 匹配开始 $/ 匹配结尾
var reg = /^c.+ab$/;
var str = "bcaaaaaaaaab";
console.log(reg.test(str)); // false
console.log(str.match(reg)); // null
// 虽然str中存在c开头的ab结尾的字符串,但由于并不是以c开头,故不匹配
10、 \s 匹配空格
var str = "gogle google gooogle goooole";
console.log(str.replace(/\s/g, ""));
// goglegooglegoooglegoooole
// 找到所有的空格,用空字符串替换;用这种方法可除去字符串中的所有空格
11、 \b 可以匹配是否到了边界, 把str当成一个单词来搜索
var reg = /google\b/g;
var str2 = 'aagoogle xxgooglea';
console.log(reg.test(str2)); // true
console.log(str2.search(reg)); // 2
// 索引值为2处,找到了匹配的字符串
12、 | 代表或者的意思 匹配其中一种字符串
var pattern = /google|baidu|bing|yahoo/;
13、 () 加上小括号 将内容进行分组,可以作为一个整体进行多次匹配
var pattern = /(google){4,8}/g; //匹配分组里的字符串 4-8 次"googlegooglegoogle"
14、 将()分组内容进行替换
var pattern = /(.*)\s(.*)/;
var str = "baidu taobao";
console.log(str.replace(pattern, "$2 $1"));
// taobao baidu
补充
可能会有一种情况,全局搜索时,可能第二次搜索时取到null,这是由于正则有一个默认属性,lastIndex,即下次检索时的默认索引值,全局搜索时会改变lastIndex的值。
var pattern = /^([a-z]+)\s([0-9]{4})$/ig;
var str = 'google 2012';
console.log(pattern.test(str)); // true
console.log(pattern.lastIndex); // 11
console.log(pattern.exec(str)); // null
解决方案:
var pattern = /^([a-z]+)\s([0-9]{4})$/ig; //使用分组
var str = 'google 2012';
console.log(pattern.test(str)); // true
pattern.lastIndex = 0; // 把lastIndex清空
console.log(pattern.lastIndex); // 0
console.log(pattern.exec(str));
// ["google 2012", "google", "2012", index: 0, input: "google 2012", groups: undefined]