正则表达式的作用:匹配特殊字符或有特殊搭配原则的字符
【工具】可视化正则表达式
基础认识
创建方法
- var reg = /abc/i;
- var reg = new RegExp("abc","i");
两个方法
reg.test(); //判断字符串上是否有符合要求的字符,返回true或false
str.match(); //把符合要求的字符串匹配出来并返回
修饰符
- i --> 忽视大小写
var reg = /abc/i
var str = "ABC" //true
- g --> 全局匹配(不在找到第一个匹配后停止)
var reg = /ab/g
var str = "abababab"
str.match(reg) //["ab","ab","ab","ab"]
- m --> 多行匹配
var reg = /^a/g //^a 表示匹配以a开头的a
var str = "adcdba" //现在只匹配一个
var str = "adcbd\na" //仍然只匹配一个
//reg = /^a/gm 加上m后可以多行匹配,才能匹配出两个a
匹配规则
方括号
一个方括号是一位,方括号里面的内容是这一位可以取的范围。
[0-9A-z] 匹配 0 ~ 9,A ~ Z,a ~ z
[^a] 非a
(abc|bcd) 匹配abc或bcd
元字符
拥有特殊含义的字符
| 元字符 | 描述 | === |
|---|---|---|
| . | 查找单个字符,除了换行和行结束符 | [^\r\n] |
| \w | 查找单词字符 | [0-9A-z_] |
| \W | 查找非单词字符 | [^\w] |
| \d | 查找数字字符 | [0-9] |
| \D | 查找非数字字符 | [^\d] |
| \s | 查找空白字符 | [\n\f\r\t\v ] |
| \s | 查找非空白字符 | [^\s] |
| \b | 匹配单词边界 | |
| \B | 匹配非单词边界 | |
| \0 | 查找NUL字符 | |
| \n | 查找换行符 | |
| \f | 查找换页符 | |
| \r | 查找回车符 | |
| \t | 查找制表符 | |
| \v | 查找垂直制表符 |
量词
n+ 【1,】 n*【0,】n?【0,1】
var reg = /\w+/g;
var str = "abcd";
str.match(reg); //["abcd"]
var reg = /\w*/g;
var str = "abcd";
str.match(reg); //["abcd",""]
n{X}【x】n{X,Y}【x, y】n{X, }【x, 】
正则表达式有一个贪婪匹配原则,即每次都匹配可以匹配的最多的数量,在表达式后加 "?" 可以把它变成不贪婪的(匹配少不匹配多)。
开头,结尾
^n n$
var reg1 = /^abc/g;
var reg2 = /ef$/g;
var str = "abcdef";
reg1.test(reg1); //true 可匹配以a开头+"bc"
reg2.test(reg2); //true 可匹配"e" + 以f结尾
紧跟,不紧跟
?=n ?!n
var str = "abaaa"
var reg = /a(?=b)/g //可匹配后面紧跟b的a
RegExp对象方法
test
检索字符串中指定的值。返回true或false
exec
检索字符串中指定的值。返回找到的值,并确定其位置。
RegExp有一个lastindex属性,它和此方法中的index是一样的(可以理解为这次匹配时游标从哪里开始匹配)。
而且我们可以修改lastindex的值,修改后执行exec方法,它的index值会跟随我们的修改。所以lastindex和exec方法是相配合的。
当然如果没有global属性的话,它每次执行都是从0开始匹配的,游标不会动。
var reg = /ab/g;
var str = "ababab";
console.log(reg.exec(str)); //["ab",index:0,input:"abababab"]
console.log(reg.exec(str)); //["ab",index:2,input:"abababab"]
console.log(reg.exec(str)); //["ab",index:4,input:"abababab"]
console.log(reg.exec(str)); //null
console.log(reg.exec(str)); //["ab",index:0,input:"abababab"]
如果使用\w+匹配,可以匹配出【1-infinite】个满足\w的字符。若想要匹配“XXXXX”形式(像aaaaa或bbbbb)的字符串怎么匹配呢?
var reg = /(\w)\1/g; //\1是反向引用第一个子表达式的内容,此时如果
想匹配三个a,可以这样---->"/(\w)\1\1/"
var str = "aaaaa";
//还可以匹配aabb式的字符串
var reg = /(\w)\1(\w)\2/g;
var str = "aabb"
在上面的情况下使用exec方法,会发现结果和之前的会有些不一样。(第一个子表达式和第二个子表达式的内容也会在返回的类数组中)
console.log(reg.exec(str)); //["aabb","a","b",index:0,input:"aabb"]
支持正则表达式的string对象方法
split
把字符串分割成字符串数组
search
检索与正则表达式相匹配的值
返回的只要不是-1就是匹配成功。返回的是成功匹配的位置。
match
找到一个或多个正则表达式的匹配
加g和不加g的结果区别
var reg = /(\w)\1(\w)\2/g;
var str = "aabb";
console.log(str.match(reg)); //["aabb","a","b",index:0,input:"aabb"]
var reg = /(\w)\1(\w)\2/;
var str = "aabb";
console.log(str.match(reg)); //["aabb"]
replace
替换与正则表达式匹配的子串
var str = "aa";
console.log(str.replace("a","b")); //"ba"
var reg = /a/g;
var str = "aa";
console.log(str.replace(reg,"b")); //"bb"
把aabb式字符串的全替换成bbaa
var reg = /(\w)\1(\w)\2/;
var str = "aabb";
console.log(str.replace(reg,"$2$2$1$1")); //子表达式在这儿可以通过$引用到
//另一种方式
console.log(str.replace(reg,function($, $1, $2){
return $2 + $2 + $1 + $1
}));
【有意思的题】
- ----> the-first-name 经过处理后变成小驼峰式 theFirstName
var str ="the-first-name";
var reg = /-(\w)/g;
console.log(str.replace(reg,function($,$1){
return $1.toUpperCase();
}))
- ---->转科学计数法 100000000 <--> 100.000.000
查找""然后替换成".",替换时注意要是非单词边界才能替换,不然可能会出现".100"
var str = "100000000";
var reg = /(?=(\B)(\d{3})+$)/g;
console.log(str.replace(reg,"."));