字面量正则表达式
格式
var reg=/a/gi;
/正则表达式内容/修饰符
两种创建方式:
var reg=new RegExp("a","g");
var reg=new RegExp("正则表达式内容","修饰符")
修饰符
g 全局匹配 查找到一个时没有完成,继续向后查找
i 不区分大小写 查找过程中不区分大小
m 多行查找
使用方法
reg.exec(字符串)
在字符串中查找是否包含该正则表达式内容,如果没有找到返回null,
否则返回一个数组,数组中的第0项就是查找到内容,群组,查找到的下标,原字符串
使用g全局匹配无效
reg.test(字符串)
判断字符串是否有满足正则表达式的内容,如果有,则返回true,否则返回false
字符串可以使用正则表达式的方法
match replace search split
元字符
组成正则表达式的基本符号叫做元字符
正常的元字符包含普通的字符和一些转义字符及特殊用途的符号
当使用到一些字符符号与正则表达式中的符号冲突是,需要将其转换为字符符号作用不使用正则符号含义,这是需要使用转义字符,\符号。例如( ) [ ] { } \ / ^ * .
通配符 . 统配任意一个字符(仅一个)
test 和 exec都是这种情况,前提条件是同一个正则表达式
var reg=/a/;
console.log(reg.exec("abac"));//0
console.log(reg.exec("abac"));//0
console.log(reg.exec("abac"));//0
var reg=/a/g; 如果使用了全局匹配,多次查找会在上次的基础上继续向后
console.log(reg.exec("abac"));//0
console.log(reg.exec("abac"));//2
console.log(reg.exec("abac"));//null
每次都是新的正则表达式不会有上面的情况出现
console.log(/a/g.test("abac"))
console.log(/a/g.test("abac"))
console.log(/a/g.test("abac"))
[] []中的内容代表任意一个字符
[.] 就是. 不是通配符
字符类的反义 不要什么什么内容,取什么内容以外的东西
[^a]
匹配所有除了a以外的字符
[^.]
匹配除了.之外的所有字符
[^.^]
匹配除了.和^字符以外的其他字符
[^_^]
匹配除了_和^字符以外的其他字符
[^\^]
除了^以外的所有字符
[a-z^o] a-z^
当^ 出现的位置如果不是[]的第一位,^ 恢复为^字符而不是反义
\w [a-zA-Z0-9_]
\W [^a-zA-Z0-9_]
\d [0-9]
\D [^0-9]
\s 空白字符
\S 除了空白字符以外的字符
例题
删除空字符
var str="aa asjd jsadkjasd daskj asdjadj askjdaskjd asj dadsk ";
str=str.replace(/\s/g,"");
console.log(str)
console.log(str.split(/\s/).join(""))
console.log(str.match(/\S/g).join(""))
重复
/a{3}/
a重复3次
/(ab){3}/
ab一共重复3次
/a{1}/
等同于a
/z{0}/ 匹配空字符 “” 任意字符串中的"" 数量是字符串长度+1
重复范围
/a{1,5}/
最小几次到最大几次的重复
/a{0,5}/
最小是最后一个空字符,最大是5个
/a{1,}/
当最大值不填写时,表示不设上限,最大无限,至少要有一个该字符
/a{0,}/
有没有这个字符都可以,也可以重复无限次
* /a{0,}/
有没有都行,可以重复无限次
+ /a{1,}/
至少要有一个,可以重复无限次
? /a{0,1}/
有没有都可以
非贪婪匹配 .*? .+?
用在两个符号之间使用 .*? 或者.+? 可以获取到最近的这两个符号之间的内容
选择匹配
|
/ab|bc/
/abc|bcd|def/
/a|b/ /[ab]/
/ab||bc/
|| 表示或者了一个""
起始符和结束符
^ $
起始和结束符,可以约束起始后或者结束前的内容,也可以约束整个字符串的长度
去除首尾空格
trim();
群组
()
当在正则表达式中使用群组()时,使用match不使用g的前提下,可以获取到被查找到所有内容以外,包括每个()
str.replace(/\《.+?\》/g,function(被查找到的每一个内容,索引下标,原字符串){
console.log(t,i,s)
})
str.replace(/\《(.+?)\》/g,function(被查找到的每一个内容,这个内容所包含的群组1,这个内容所包含的群组2,...,索引下标,原字符串){
console.log(t,$1,i,s)
})
// console.log("abcd".match(/^(a)(bc)(d)$/))
// console.log("《西游记》《红楼梦》《水浒》《三国演义》是中国四大名著".match(/\《(.+?)\》/g))
var str="《西游记》《红楼梦》《水浒》《三国演义》是中国四大名著";
str.replace(/\《(.+?)\》/g,function(t,i,s){
console.log(t,i,s)
})
例题 替换手机号中间****
var str="18656467892";
// str=str.replace(/^(\d{3})\d{4}(\d{4})$/,function(t,$1,$2){
// return $1+"****"+$2;
// })
str=str.replace(/^(\d{3})\d{4}(\d{4})$/,"$1****$2");
console.log(str)
断言
断言 基于群组的基础完成的判断
/内容(?=条件)/
后置肯定断言
/内容(?!条件)/
后置否定断言
/(?<=条件)内容/
前置肯定断言
/(?<!条件)内容/
前置否定断言
例题
var str="a1ata2";
// console.log(str.replace(/a(?=[a-zA-Z])/g,"0"))
console.log(str.replace(/a(?![a-zA-Z])/g,"0"))
// var str="abcbdb";
// console.log(str.replace(/(?<=c)b/g,"0"))
// console.log(str.replace(/(?<!c)b/g,"0"))
var str="《西游记》《红楼梦》《水浒》《三国演义》是中国四大名著";
console.log(str.match(/(?<=\《).*?(?=\》)/g))
/^(?=\D+\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,16}$/
重复判断
(内容)\1*
可以有不重复的
(内容)\1+
至少重复一次以上的
面试题 obj重复字符的数量
var obj={
a:"asdasdasd",
b:"qiweqwiuasnscsak",
c:"alksdjaskldjq laksjdlajsd",
d:"opqpwoidpowdkop alksjdlaks lkasjdlkasjd "
};
//======low b 写法
// var str="";
// for(var key in obj){
// str+=obj[key];
// }
// var arr=str.split("");
// arr.sort();
// str=arr.join("");
// var arr1=str.match(/(\w)\1*/g);
// console.log(arr1)
// var s="";
// for(var i=0;i<arr1.length;i++){
// s+=arr1[i][0]+"{"+arr1[i].length+"}";
// }
// console.log(s)
//=======不low写法
function parse(obj){
return Object.values(obj).join("").split("").sort().join("").match(/(\w)\1*/g).reduce(function(v,t){
return v+t[0]+"{"+t.length+"}";
},"")
}
var s=parse(obj);
console.log(s)
var arr=["i love javascript","javascript is good language","i want to study javascript"];
console.log(arr.join(" ").split(/\s+/).sort().join(" ").match(/((?<=\s+)javascript(?=\s+)|(?<=\s+)i(?=\s+))\1*/g))