6.正则表达式

90 阅读4分钟

正则是复杂数据类型,用来验证字符串是不是符合规则的,也叫做正则表达式。

创建正则

字面量方式:
    语法:var 变量名 = /字符/
内置构造函数
    语法:var 变量名 = new RegExp('字符')
```两种创建方式的区别```
 1.语法不同
   修饰符的书写
       字面量的方式:直接书写在正则的后面 var 变量名 = /字符/ig
       内置构造函数:var 变量名 = new RegExp('字符','ig')
 2.拼接字符串
       字面量的方式是不能拼接字符串的
       内置构造函数的方式是可以拼接字符串的
 3.元字符的书写
       字面量的方式:直接书写   /\d\w\s/
       内置构造函数:需要使用转义符 \\d\\w\\s

正则常用方法

test():
    语法:正则.test(你要验证的内容)
    返回值:布尔值
        true:符合验证要求;
        false:不符合验证要求;
            var reg = /abc/
            var str = 'addfrdah'
            //用来验证str里面是否有abc
            var res = reg.test(str)
            console.log(res)
exec():
    语法:正则.esec(字符串)用来捕获的
    返回值:
        如果没有,返回null
            var reg = /\d{3}/ 
        如果有,
            没有()也没有全局g
                返回数组,索引0的位置就是捕获出来的内容,永远只捕获第一个满足的。
            有全局g
                返回数组,索引0的位置就是捕获出来的内容,多次捕获的时候会从上次结束的位置向后检索,直到结果为null,如果还有捕获,会从头开始捕获。
            有括号()
                返回数组,索引0的位置返回完整的字符串,所以1,2,3...的位置依次是单独捕获到的内容。

基本元字符

\d:表示 一位 数字
\D:表示 一位 非数字
    var reg = /\D/
    console.log(res.test('dvfvsf87ca'))     //true
\s:表示 一位 空白内容,包括空格、缩进、换行
\S:表示 一位 非空白内容
\w:表示 一位 数字(0-9)、字母(a-zA-Z)、下划线(_)中的一位
\W:表示 一位 非数字(0-9)、字母(a-zA-Z)、下划线(_)中的一位
 .:表示 除了换行以外的任意内容,至少要有一位非换行的内容
    var reg = /\d.\d/
    console.log(res.test('1.5'))
 \:是一个转义符,就是把没有意义的转成有意义的,把有意义的转成没有意义的
    var reg = /\d\.\d/  现在点就单纯的是一个点了
    console.log(res.test('1.5'))  //true
    console.log(res.test('1#5'))  //false

边界符

^:表示的是以什么开头
   var reg = /^\d/,表示以数字开头
$:表示的是以什么结尾
   var reg = /\s$/,表示以空白开头
   //如果一起使用表示从开头到结尾
   var reg = /^\d$/,表示从头到尾都是一位数字

限定符

    *:表示前面的符号出现0-多次
    +:表示前面的符号出现1-多次
    ?:表示前面的符号出现0-1次
    {n}:表示前面的符号连续出现指定的次数,n是几就出现几次
    {n,}:表示前面的符号至少连续出现n次
    {n,m}:表示前面的字符最少连续出现n次,最多连续出现m次

特殊符号

     ():
        第一层意思:表示一个整体
          var reg = /(abc)/
          console.log(reg.test('abc')) 
        第二层意思:表示单独捕获
      |: 占位或,表示这个符号的左侧或者右侧 任意一侧出现都可以
          var reg = /abc|def/
          console.log(reg.test('abc'))
     []: 包含的意思,书写在中括号里的任意一个都可以
          var reg = /[abcd]/
          console.log(reg.test('abcde'))
          //注意:一个符号占一个字符的位置
    [^]: 表示非:意思是书写在中括号里的任意一个都不可以
          //注意:一个符号占一个字符的位置
          var reg = /[^abcd]/
          console.log(reg.test('af'))      //true
      -: 表示到:从什么到什么,
          必须是ASCII连续的,一般和[]或者[^]一起用

修饰符

用来修饰整个正则表达式的符号,书写在正则表达式的外面
i:忽略大小写的
   var reg = /[a-z]/!
   console.log(reg.test('A'))   //true
g:表示全局

正则的两大特性

懒惰性:
    当我们要进行捕获的时候,只有满足的就直接返回了,不再往后捕获了
    //解决方法就是使用全局g
贪婪性:
    贪婪匹配:能拿多少拿多少
    非贪婪匹配:尽可能地少拿
    非贪婪限定符:
        *?
        +?
        ??
        {n,}?
        {n,m}?

能使用正则的字符串方法

replace():字符串.replace(正则,'换上片段')
        作用:就是用换上片段替换掉换下片段
        特点:在没有全局g的时候,替换效果跟replace()一样只能替换一个
        特点:如果有全局g的时候,有多少替换多少
search():字符串.search(/你要检测的数据/) //和indexof()一样
        作用:就是用来验证字符串中有没有这个数据,如果有返回的就是这个数据对应的索引,没有就返回-1match():字符串.match('字符串片段')  //这个方法和exec一样
        作用:就是从字符串中捕获到满足条件的内容,以数组的形式返回,如果使用正则没有加全局g,只捕获到第一个满足条件的内容.
       正则预查(扩展)

正则预查

正向预查
    正向肯定预查:?=
      var reg = /windows(?=\d+)/g
    正向否定预查:?!
      var reg = /windows(?!\d+)/g
负向预查
    负向肯定预查:?<=
      var reg = /(?<=\d+)windows/g
    负向否定预查:?<!
      var reg = /(?<!\d+)windows/g