正则表达式分为元字符和修饰符,修饰符有三个,本文中说说对于元字符的理解。
- . 通配符, 匹配任何一个字符
变为字符的方法: a.放在[]中 b.. 利用转义字符
var str="catcbtc/tc1tc.tcabt";
console.log(str.match(/c.t/g)); //["cat", "cbt", "c/t", "c1t", "c.t"]
console.log(str.match(/c.t/g)); //[c.t]
console.log(str.match(/c[.]t/g)); //[c.t]
2.[] 或者符,匹配其中任意一个
var str="catcbtc/tc1tc.tcabt";
console.log(str.match(/c[abcdefghi]t/g)) //["cat", "cbt"]
console.log(str.match(/c[a-i]t/g)) //["cat", "cbt"]
应用举例
var str="中国四大古典名著有'西游记','红楼梦','水浒','三国演义'";
str=str.replace(/'/g,function(item){
return n++%2===0 ? "《" : "》";
});
console.log(str); //"中国四大古典名著有《西游记》,《红楼梦》,《水浒》,《三国演义》"
str=str.replace(/[《》]/g,function(item){
return item==="《" ? "<" : ">";
});
console.log(str); //"中国四大古典名著有<西游记>,<红楼梦>,<水浒>,<水浒>"
3. 相当于字符
两个 在字符或者正则表达式的[]都是一个
console.log("aa\aa".match(/[\]/g)) // [""]
4.^ 不要后面的字符,但只能在[]的第一个字符位置才起此作用,在中间位置,作为字符的作用
console.log("abc^def".match(/[^^]/g));// ["a", "b", "c", "d", "e", "f"] 不要^
5.贪婪匹配
console.log("aaaaaaa".match(/a{1,4}/g)); // ["aaaa", "aaa"] 先匹配最大的字符串 贪婪匹配
console.log("aaaaaaa".match(/a{0,3}/g)) // ["aaa", "aaa", "a", ""] 因为0是最小,匹配空字符
7.简写
a:常规简写
1)w [a-zA-Z0-9_] W [^a-zA-Z0-9_]
2)d [0-9] D [^0-9]
3)s 空字符 S 不要空字符
//大写和小写是相反的
b:贪婪匹配简写
1)* /a*/g /a{0,}/g 可以没有,可以有若干个
2)+ /a+/g /a{1,}/g 匹配至少1个也可以多个
3)? /a?/g /a{0,1}/g 可以有也可以没有
8.非贪婪匹配
和贪婪匹配的区别: 区分符号为 ? 当使用了贪婪匹配,也就是字符重复了,后面加 ? ,就是非贪婪,选取最小的
常见: *? +? {3,}?
例如:
var str = "<p>Uber的这款无人车原型配备了多个<strong>摄像头</strong>、<em>激光雷达</em>以及<span>传感器</span>,可看清100米范围内任何方向的东西</p><br/><p>第二行内容,哎嘿,第二行内容</p>";
str=str.replace(/<.*?>/g,function(item){
if(item==="<br/>") return "
";
return "";
});
console.log(str); // 去掉所有的标签 换行
9.() 群组
1)当使用match时,如果使用群组,加上g和不加g是有差距
不加g可以将每个()群组的内容单独拿出来,在数组中按照顺序从下标1 开始放置
加g就不能找到群组内容,只有满足正则的内容,()内的内容不能查找
console.log("10[a]3[bc]".match(/(d+)[([a-zA-Z]+)]/g)) // ["10[a]", "3[bc]"]
console.log("10[a]3[bc]".match(/(d+)[([a-zA-Z]+)]/g)) //["10[a]", "10", "a", index: 0, input: "10[a]3[bc]", groups: undefined]
2)在replace中如果不使用群组,后面的函数中参数第一位时符合正则内容,第二位是这个字符的下标
使用了群组,后面的函数中参数分别是符合正则的内容,和每个群组的内容
var str="10[a]3[bc]".replace(/(d+)[([a-zA-Z]+)]/g,function(item1,item2,item3){
return item3.repeat(item2); // 把item3重复item2个数量,这里 item2对应的是 10 3 item3对应的是 a bc ,然后替换item1,也就是满足正则的内容
}
console.log(str) //aaaaaaaaaabcbcbc
//替换字符内容
var str="background-position-x".replace(/-([a-z])/g,function(item,item1){
return item1.toUpperCase();
});
console.log(str); // backgroundPositionX
//隐藏手机号
var str="13879061235".replace(/(d{3})d{4}(d{4})/,"$1****$2");
console.log(str); //138****1235 群组会默认按照顺序把内容 赋予变量,只能使用$1,$2....等
- 1 重复
变成数组,排序,转回字符串,查找重复字符
用法: ([a-z])1* ([a-z])1+
var str="aaabbffddeeaaggfddssaaggeer".split("").sort().join("").match(/(w)1*/g).reduce(function(value,item){
value+=item[0]+"["+item.length+"]";
return value;
},"")
console.log(str); // a[7]b[2]d[4]e[4]f[3]g[4]r[1]s[2]
- ^开始 $结束
要完成一个全体内容匹配就需要使用起始和结束符来操作 : 例如表输入框
console.log("bbaacc".match(/^a+/g));// 要求起始就需要是一个a以上
console.log("bbaacc".match(/c+$/g));// 要求必须以某个字符结束
12.| 或者(选择) || 两个||中间表示空字符 是按照顺序查找的
console.log("abcd".match(/ab||cd/g)); // ["ab", "", "", ""]
- 断言
a(?=b) 前瞻断言 查找后面紧跟b的a字符
a(?!b) 前瞻断言 查找后面没有紧跟b的a字符
(?<=a)b 后瞻断言 查找前面是a的b字符
(?<!a)b 后瞻断言 查找前面没有a的b字符
console.log("abac".replace(/a(?=b)/g,"z")); // zbac
console.log("abac".replace(/a(?!b)/g,"z")); // abzc
console.log("abcb".replace(/(?<=a)b/g,"z")); //azcb
console.log("abcb".replace(/(?<!a)b/g,"z")); //abcz