javascript基础-正则表达式

常用正则字符

  1. ^ 匹配字符串的开始位置
  2. $ 匹配字符串的结束位置
  3. * 代表匹配前面的表达式0次或多次
  4. + 匹配前面的表达式1次或多次
  5. ? 如果跟表达式,则匹配前面的表达式0次或1次;如果跟着其他限制符,则代表惰性模式
  6. [] 字符集合,匹配所包含的任意一个字符
  7. {n,m} 匹配前面的表达式n-m次
  8. () 划分子表达式
  9. x|y 匹配x或者y
  10. \d 匹配数字
  11. \D 匹配非数字
  12. \s 匹配空白符
  13. \S 匹配非空白符
  14. \w 匹配非特殊字符(数字、字符、下划线_)
  15. \W 匹配特殊字符
  16. i 忽略大小写匹配
  17. g 全局匹配

2种定义方式

  1. 使用RegExp构造函数
var reg=new RegExp("/\\d/","i"); //使用构造函数必须对特殊字符转义
复制代码
  1. 使用字面量
var reg=/\d/i; //无需转义
复制代码

正则表达式方法

  1. test()
    找到匹配字符串返回true,找不到返回false
    用法:exp.test(str)
//判断是否全为数字
var str="387467568";
var exp=/\D/;
exp.test(str);  //false
复制代码
  1. exec()
    找到匹配字符串返回包含第一个匹配项的数组,没有返回null。返回的数组包含两个额外的属性:indexinput,其中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处开始
复制代码
  1. match()
    搜索符合正则的内容,返回匹配内容,否则返回null
    用法:str.match(exp)
    注意:match()返回数组的内容和g有关,当没有设置全局模式时,只匹配到一个子串就结束,数组第一项为匹配到的字符串,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性indexinput
    如果具有标志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属性。

  1. search()
    搜索符合正则的内容,返回搜索到的位置,搜索失败返回-1
    用法:str.search(exp)
//在字符中查找b,不区分大小写
var str="ahgbsdguc";
var exp=/b/i;
str.search(exp); //3
复制代码
  1. 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}$/

复制代码

转载于:https://juejin.im/post/5ca6cbd5e51d455e096ac654

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值