正则表达式是用来匹配和处理文本的字符串
第一节 匹配单个字符
1.1 匹配纯文本
例:替换字符串中的名称
var r = "my name is chijiandelongtao";
r = r.replace(/chijiandelongtao/,"LI");
console.log(r);
当要替换的字符串有多个时:
var r = "my name is chijiandelongtaochijiandelongtao";
//g代表 global (全局) 若想不区分大小写 可写成/gi
r = r.replace(/chijiandelongtao/g,"LI");
console.log(r);
1.2匹配任意字符
. 号可以匹配任意单个字符:
var r = "my name is chijiandelongtao";
r = r.replace(/.hijiandel.ngta./g,"LI");
console.log(r);
1.2匹配特殊字符
.号在正则里有特殊含义(还有别的 如 + ,?,^ 等),如果想在字符串里找到 . ,需要加上转义字符\
var r = "my name is chijiandelongtao.";
r = r.replace(/\./g,"hehe");
console.log(r);
//如果不加则会把所有字符都替换成hehe
var r = "my name is chijiandelongtao.";
r = r.replace(/./g,"hehe");
console.log(r);
第二节 匹配一组字符
2.1 匹配多个字符中的某一个
[ ]用于定义一个字符集,表示以该字符集内字符开头的字符串。注意集合内是或的关系。[cs] 表示必须以c开头或者以s开头。[.]就表示匹配. 无需转义因为[.]=[\.]。字符集内的字符将被解释成普通字符:
var r = "my name is chijiandelongtao shijiandelongtao";
r = r.replace(/[cs]hijiandelongtao/g,"LI");
console.log(r);
2.2 取非匹配
[ ]用于定义一个字符集,^ 表示你想对一个字符集和进行取非匹配:
var r = "my name is chijiandelongtao shijiandelongtao zhijiandelongtao";
r = r.replace(/[^cs]hijiandelongtao/g,"LI");
console.log(r);
第三节 使用元字符 (正则里具有特殊含义的符号)
3.1 特殊符号转义
具有特殊含义的字符需要加上转义字符 \
var r = "my name is chijiandelongtao shijiandelongtao[1] zhijiandelongtao[0]";
r = r.replace(/[zs]hijiandelongtao[0-9]/g,"LI");
console.log(r);
//这样是匹配不到的,因为[] 是特殊字符,需要加上转义字符 \
var r = "my name is chijiandelongtao shijiandelongtao[1] zhijiandelongtao[0]";
r = r.replace(/[zs]hijiandelongtao\[[0-9]\]/g,"LI");
console.log(r);
3.2 匹配空白字符
元字符 | 说明 |
---|---|
\n | 换行 |
\f | 换页 |
\r | 回车 |
\t | 制表符 (Tab按键) |
\v | 垂直制表符 |
\s | 任意空白字符 |
\S | 任意非空白字符 |
var r = "my name is chijiandelongtao shijiandelongtao[1] ";
r = r.replace(/\s/g,"LI");
console.log(r);
//非空白是大 S 空白是小 s
var r = "my name is chijiandelongtao shijiandelongtao[1] ";
r = r.replace(/\S/g,"LI");
console.log(r);
3.3 匹配数字
元字符 | 说明 |
---|---|
\d | 任意一个数字字符 |
\D | 任意一个非数字字符 |
var r = "my name is chijiandelongtao shijiandelongtao[1] ";
r = r.replace(/\d/g,"LI");
console.log(r);
3.4 匹配字母和数字
元字符 | 说明 |
---|---|
\w | 任意一个字母数字字符 (等价于 [a-zA-Z0-9_]) |
\W | 任意一个非字母数字字符 |
var r = "[m]y_name_is_chijiandelongtao_shijiandelongtao[1] ";
r = r.replace(/\w/g,"LI");
console.log(r);
第四节 重复匹配
4.1 匹配一个或多个字符
匹配一个或多个字符使用 + 号,不匹配零个字符的情况。如a+ 匹配连续出现的a
var r = "153708@qq.com";
//w+匹配连续出现的字母数字或者下划线(_)
r = r.replace(/\w+@\w+\.\w+/,"我擦泪");
console.log(r);
4.2 匹配零个或多个字符
*表示任意数量,集合表示是[0, +00);
+表示至少1次,集合表示是[1, +00);
var r = "@qq.com";
r = r.replace(/\w*@/,"我擦泪");
console.log(r);
4.3 匹配零个或一个字符
匹配零个或者一个字符使用 ?
var r = "http: https: httppp:";
//? 前面的s要么出现要么不出现
r = r.match(/https?:/g);
console.log(r);
4.5 为重复匹配次数设置精确值
重复次数使用 {number}
var r = "http: https: httppp:";
//匹配h至少重复一次或者更多次,t重复两次,p重复1-2次的字符
r = r.match(/h{1,}t{2}p{1,2}/g);
console.log(r);
4.6 防止过度匹配
涉及到贪婪型匹配和懒惰型匹配的问题
var A= "<B>kkkk</B>-------------<B>llllHi</B>"
A = A.match(/<[Bb]>.*</g)
console.log(A);
//结果是 <B>kkkk</B>-------------<B>llllHi< 。但是正确的结果应该是 <B>kkkk<
//因为*和+都是贪婪型元字符,他们进行匹配时会从文本开头尽可能的匹配到文本末尾。针对这种情况应该使用懒惰型元字符
贪婪型 | 懒惰型 |
---|---|
* | *? |
+ | +? |
var A= "<B>kkkk</B>-------------<B>llllHi</B>"
A = A.match(/<[Bb]>.*?</g)
console.log(A);