常用正则字符
^
匹配字符串的开始位置$
匹配字符串的结束位置*
代表匹配前面的表达式0次或多次+
匹配前面的表达式1次或多次?
如果跟表达式,则匹配前面的表达式0次或1次;如果跟着其他限制符,则代表惰性模式[]
字符集合,匹配所包含的任意一个字符{n,m}
匹配前面的表达式n-m次()
划分子表达式x|y
匹配x或者y\d
匹配数字\D
匹配非数字\s
匹配空白符\S
匹配非空白符\w
匹配非特殊字符(数字、字符、下划线_)\W
匹配特殊字符i
忽略大小写匹配g
全局匹配
2种定义方式
- 使用RegExp构造函数
var reg=new RegExp("/\\d/","i"); //使用构造函数必须对特殊字符转义
复制代码
- 使用字面量
var reg=/\d/i; //无需转义
复制代码
正则表达式方法
- test()
找到匹配字符串返回true,找不到返回false
用法:exp.test(str)
//判断是否全为数字
var str="387467568";
var exp=/\D/;
exp.test(str); //false
复制代码
- exec()
找到匹配字符串返回包含第一个匹配项的数组,没有返回null。返回的数组包含两个额外的属性:index
和input
,其中index
表示匹配项的位置,input
表示输入的字符串。不管有没有设置全局模式,都只返回第一个匹配子串。设置为全局模式时,可以多次调用返回后面的匹配子串
//非全局模式
var str = "I love antzone ,this is animate";
var reg = /an/;
reg.exec(str); //["an"]
reg.exec(str); //["an"]
//全局模式
var str = "I love antzone ,this is animate";
var reg = /an/g;
var res1=reg.exec(str); //["an"]
res1.index; //7
var res2=reg.exec(str); //["an"]
res2.index; //24 因为全局模式下第二次匹配是从上一次的lastIndex处开始
复制代码
- match()
搜索符合正则的内容,返回匹配内容,否则返回null
用法:str.match(exp)
注意:match()
返回数组的内容和g
有关,当没有设置全局模式时,只匹配到一个子串就结束,数组第一项为匹配到的字符串,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性index
和input
。
如果具有标志g
,则match()
方法将执行全局检索,找到所有匹配子字符串。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是所有的匹配子串,而且也没有 index 属性或 input 属性。
//非全局模式
var str = "I love antzone ,this is animate";
var reg = /an/;
var res=str.match(reg); //["an"]
res[0]; //"an"
res.index; //7
res.input; //"I love antzone ,this is animate"
//全局模式
var str = "I love antzone ,this is animate";
var reg = /an/g;
var res=str.match(reg); //["an","an"]
res.index; //undefined
res.input; //undefined
复制代码
exec()与match()的对比:
(1) exec()是正则表达式的方法,使用方式为reg.exec(str);match()是字符串的方法,使用方式为str.match(reg)
(2)非全局模式时,exec()与match()结果相同,如果没有匹配到字符串则返回null,匹配到则返回数组,数组第一个参数存的是匹配到的第一个子字符串,后面存的是每个分组里匹配到的子串,同时有两个额外参数index和input
(3)全局模式时,exec()返回值与非全局模式相同,不过可以通过多次调用匹配后续子串;match()则返回所有匹配到的子串,没有分组子串,也没有index和input属性。
- search()
搜索符合正则的内容,返回搜索到的位置,搜索失败返回-1
用法:str.search(exp)
//在字符中查找b,不区分大小写
var str="ahgbsdguc";
var exp=/b/i;
str.search(exp); //3
复制代码
- replace()
查找符合正则的内容,替换为对应的字符串,返回替换后的内容
用法:str.replace(exp,newStr)
进阶用法:$&
与正则想匹配的字符串$1,$2,..$n
匹配结果中对应的分组匹配结果 高级用法:
str.replace(exp,回调函数)
此时回调函数的arguments会有n+3个参数(n为正则匹配到的次数),参数为:
(1)匹配到的字符串 (2)如果正则使用了分组则为分组匹配到的字符串否则无此参数 (3)匹配字符串的对应索引位置 (4)原始字符串
//直接替换
var str="abdhe193829bdh";
var exp=/\D/g;
str=str.replace(exp,"");
console.log(str); //193829
//进阶用法
var str="abc";
var exp=/b/;
str=str.replace(exp,"$&123"); //ab123c
var str="abc";
var exp=/(a)/;
str=str.replace(exp,"$1zzz"); /azzzbc
//高级用法
var str="sjn@163.com";
var exp=/j(.+)(@)(.*)/;
var str=str.replace(exp,function(){
console.log(arguments); //["jn@163.com", "n", "@", "163.com", 1, "sjn@163.com"]
return "返回值替换匹配到的字符串"
})
console.log(str); //s返回值替换匹配到的字符串
复制代码
贪婪与惰性
“贪婪”指如果符合要求就一直往后匹配,一直到无法匹配为止;
“惰性”指一旦匹配到合适的就结束,不在继续匹配下去。
“贪婪”模式的标识符:+,?,*,{n},{n,},{n,m}
“惰性”模式的标识符:+?,??,*?,{n}?,{n,}?,{n,m}?
var str="shdu8hdueh7du8sd7hue";
var exp=/8[a-zA-Z0-9]*7/;
str=str.match(exp);
console.log(str[0]); //8hdueh7du8sd7 贪婪
var str="shdu8hdueh7du8sd7hue";
var exp=/8[a-zA-Z0-9]*?7/;
str=str.match(exp);
console.log(str[0]); //8hdueh7 惰性
复制代码
常用实例
//取出字符串最后一段数字
//30sjhdue0090 取出0090
//78ediu8w93 取出93
exp=/\d+$/;
//统计空格个数
var str="wjidi whu dih hdui he";
var exp=/\s/g;
str=str.match(exp);
console.log(str.length); //5
//简单判断手机号码是否合格 11位数字
var exp=/^\d{11}$/
//用户名正则
//用户名只能中文、英文、数字、下划线、4-16个字符
var exp=/^[\u4e00-\u9fa5\w]{4,16}$/
复制代码