关于js 正则表达式的学习总结

198 阅读5分钟

正则表达式

总结了下js中正则表达式的基本用法,算是查缺补漏了。

正则表表达式的基本用法

创建一个正则表达式

可以通过创建对象和字面量两种方式来创建一个正则表达式,不过一般会通过字面量创建,因为方便。

    //RegExp 对象用于规定在文本中检索的内容。
    //RegExp 是正则表达式的缩写。
    let re = new RegExp('a');
    let re2 = /a/;//使用字面量定义一个正则,perl风格,与上面的方法效果一样。//是定界符

简单的使用

正则表达式常用于校验字符串,比如:通过字符串的test方法校验一个正则是否存在于字符串中等。

    console.log(re.test('abc'));//使用正则的test方法,返回true 或 false
    console.log('abc'.search(re));//使用字符串的search方法来查找正则 返回查找到的位置

需要注意的是,正则的常用方法中,test(),exec()是正则对象的方法,而search(),match(),replace()是字符串的方法。

字符串的match()方法

正则中的match()方法用于匹配字符串,返回一个满足匹配条件的数组。

    const str = 'dsai234saetsafdj4535fds4ahofi435dj243532432lds2a43iep3qgetwn';
    //找出所有数字:

    let re = /\d/;// \d是转义,意思是所有数字都可以匹配。
    console.log(str.match(re));// 只出来一个 2,因为\d只代表一个数字(如果不写量词,默认匹配一个字符)

    let re2 = /\d+/;//给\d加一个量词 加号代表量词,表示若干个。如果是特定数量的,可以用{n} :n是数字
    console.log(str.match(re2));//出来"234" 正则默认匹配模式是贪婪匹配,如果都符合要求,出来尽量长的符合条件的字符串(越长越好,越多越好)

    let re3 = /\d+/g;//增加一个选项 g 代表全局匹配
    console.log(str.match(re3));// ["234", "4535", "4", "435", "243532432", "2", "43", "3"] 出来一个数组

注意:match()方法匹配不到返回null,而之前的search()方法,匹配不到返回-1

字符串的replace()方法

replace方法用于替换掉字符串的指定内容,通常会加上一个选项g,表示全局替换,也就用全部替换。

    const str = 'dsai234saetsafdj4535fads4ahofi435aadj24353a2432alds2a43iep3qgetwn';
    //将所有的 a 忽略大小写替换成 *:
    let str2 = str.replace(/a/ig,'*');//选项可以混合使用,正则是第一个参数,表示把什么替换成 *
    console.log(str2);//ds*i234s*ets*fdj4535f*ds4*hofi435**dj24353*2432*lds2*43iep3qgetwn

元字符

正则中[]是元字符,表示范围,有点类似sql中的语法。

    //元字符[]
    //1.代表任意一个:
    let re = /a[123]c/;//表示1,2,3中的任意一个(不加量词都表示一个)比如 'a1c','a2c'
    //2.范围
    let re2 = /[0-9]/;//表示处于0~9之间的一个数字,注意 -两边只能连接一个字符
    let re3 = /[0-99]/;//表示第一位是0~9之间的数字,第二位必须是9 如'09','19'等
    let re4 = /[0-9a-z]/i;//可以连着写,第一位0~9,第二位a~z忽略大小写
    //3.排除
    let re5 = /[^0-9]/;//表示除了0~9,其他的字符都可以匹配成功。

转义

  • \d 代表数字, 如:[0-9]

  • \w 代表字母数字下划线, 如:[a-z0-9_]

  • \s 代表空白

  • .(点) 匹配任意字符,最好不要用

  • \D 代表[^0-9]

  • \W代表[^a-z0-9_]

  • \S代表 非空白

量词

正则中的量词都可医用{}表示,+,?这些是简写方式

//量词
//1. {n} 匹配 n个字符
let re1 = /a{6}/; //匹配六个a,多了少了都不行
//2.{n,m} 匹配 n到 m个字符
let re2 = /\d{5,12}/;//匹配5-12个数字
//3.{n,} 匹配最少 n个字符
let re3 = /\w{6,}/;//六个以上的合法字符
//4.{,m} 匹配最多m个字符

//5. + 相当于 {1,} 最少一个

//6. ? 相当于 {0,1} 可以 有一个或者没有
let re4 = /\.jsx?$/;//x可以有也可以没有,.jx和.jsx都可以匹配,当然 \.是 . 的转义,$是修饰符,表示结尾。

修饰符

正则表达式有一个特点: 比如正则的test方法,只要要匹配的字符串有一部分符合要求,就会返回true。

let btn = document.getElementById("btn");
    btn.onclick = function(){
      let str = document.getElementById("text").value;
      let reg = /[1-9]\d{4,11}/;//假设qq号最少5位,对多12位,0不能开头 注意:元字符[]中用-表示范围,量词{}中用逗号表示范围,
      if(reg.test(str)){
        alert("通过");
      } else{
        alert("错了");
      }
    }
  }

这个测试qq号的例子展现了问题,比如输入aaa123456这样的只有一部分满足条件的字符串他也能通过测试。 当然,我们给这个正则加两个修饰符就可以很轻松的解决掉这个问题。

let reg2 = /^[1-9]\d{4,11}$/;

^表示行首,表示从行首开始检测。$表示行尾,表示检测到行尾结束。

正则中的或运算

一个简单的匹配图片的例子:

    //正则中的或运算符 |
    let reg = /\.(png|jpg|gif)$/;//匹配图片:以.png或.jpg或.gif结尾的都可以匹配
    console.log(reg.test('1.jpg'));//true
    console.log(reg.test('jpg'));//false

由于|运算符在各种语言中的优先级比较低,使用的时候最好加上()。不过经过测试,或运算符的优先级似乎提高了?

    let reg2 = /\.png|jpg|gif$/;
    console.log(reg.test('.jpggif'))//false
    let reg3 = /m|food/;
    console.log(reg3.test('mood'));//true
    //经过测试,|运算符的优先级似乎提高了。

如上代码,不加()也能正常匹配。