Skip to content

正则表达式


一、什么是正则表达式

1. 什么是正则表达式

  • 正则表达式( regular expression )描述了 ,经常被用于检查字符串是否符合预定的格式要求

    例子:

    js
    // 检查某个字符串是否为 6 位数字
    
    // 待检查的字符串
    const str = '123456'  // 描述了字符串必须是 “6 位数字” 构成的规则
    // 正则表达式的规则
    const reg = /^\d{6}$/
    // 正则检查
    if (reg.test(str)) {  // test() 检查某个字符串是否符合正则要求
      console.log('符合要求')
    } else {
      console.log('不符合要求')
    }

2. 正则表达式 “按位” 描述规则

  • 正则表达式 “按位” 描述规则,是指它是一位一位的描述字符串的构成形式
  • 比如检查字符串是否符合:以字母 m 开头,然后是 3 位数字,最后以字母 n 结尾( /^m\d\d\dn$//^m\d{3}n$/

二、正则表达式的基本使用

1. 正则表达式的创建

  • 使用 /内容/的语法形式,可以快速创建正则表达式(推荐)

    js
    const reg = /^\d{6}$/
  • 也可以使用 new RegExp('内容') 的形式,创建正则表达式(不推荐,容易有歧义)

    js
    // 在字符串中 \ 已经表示转义,所以要使用 \\ ,且两侧不用添加 /
    const reg = new RegExp('^\\d{6}$')
  • 使用 typeof 运算符检查正则表达式的类型为 object

    js
    console.log(typeof reg)  // object

2. 元字符

  • “元字符” 是指 的字符
元字符功能
\d匹配一个数字
\D匹配一个非数字字符
\w匹配一个单字字符(字母、数字或者下划线)
\W匹配一个非单字字符
\s匹配一个空白字符,包括空格、制表符和换行符
.任意字符
^匹配开头
$匹配结尾
\只匹配几项中的一项
  • 元字符注意事项

    1. 如果使用 new RegExp() 写法时,反斜杠需要多写一个
    2. 比如 /^\d{3}$/new RegExp('^\\d{3}$') 是等同意义
  • 元字符使用举例

    1. 某快递公司运单号形式是这样的:123-4567-890,请使用 正则表达式 检查某字符串是否符合此格式

      js
      const str = '123-4267-890'
      const reg = /^\d{3}-\d{4}-\d{3}$/
      console.log(reg.test(str))  // true
  • 字符的转义

    1. 在特殊字符之前的反斜杠 \ 表示下个字符不是特殊字符,应该按照字面理解

      js
      const reg = /^.$/  // 检查字符串是不是任意字符
      const reg = /^\.$/  // 检查字符串是不是一个.
      const reg = /^\\$/  // 检查字符串是不是一个反斜杠
    2. 不管一个符号有没有特殊意义,都可以在其之前添加一个 \ 以确保它表达的是这个符号的本身

      js
      // 匹配 123.45^67#89
      const str = '123.45^67#89'
      const reg = /^\d{3}\.\d{2}\^\d{2}\#\d{2}$/  // # 号前的反斜杠可有可无,加上确保安全
      console.log(reg.test(str))  // true

3. 方括号表示法

  • 使用方括号,比如 [xyz] ,可以 ,表示匹配方括号中任意字符

  • 某学校的学号规定:第 1 位是个字母,b 表示本科生, y 表示研究生,后面是 7 位数字,用正则表示为:/^[by]\d{7}$/

  • 可以使用

元字符等价的方括号表示法
\d[0-9]
\D[^0-9]
\w[A-Za-z0-9_]
\W[^A-Za-z0-9_]
  • 方括号表示法练习

    1. 请验证某字符串是否是5位字母,大小写均可 -> /^[a-zA-Z]{5}$/
    2. 请验证某字符串是否是5位,且仅有小写字母、点构成 -> /^[a-z.]{5}$/
    3. 请验证某字符串是否是4位小写字母,且最后一位不能是 m 字母 -> /^[a-z]{3}[a-ln-z]$/
  • 方括号中除了反斜杠 \ 需要转义外,其他元字符不需要转义

4. 量词

量词意义
*匹配前一个表达式 0 次或者多次,等价于
+匹配前面一个表达式 1 次或者多次,等价于
?匹配前面一个表达式 0 次或者 1 次,等价于
n 是一个正整数,匹配前面一个字符刚好出现了 n 次
n 是一个正整数,匹配前一个字符至少出现了 n 次
n 和 m 都是正整数,匹配前面的字符至少 n 次,最多 m 次
  • 量词例子:
    1. 请验证字符串是否符合手机号码的规则:11 位数字,并且肯定以 1 开头 -> /^1\d{10}$/
    2. 请验证某字符串是否是这样:以字母开头,中间是任意位数字(最少 1 位)构成,并以字母结尾 -> /^[a-zA-Z]\d+[a-zA-Z]$/
    3. 请验证某字符串是否符合网址规侧:以 www. 开头,中间是任意(最少 1 位)的字符(字母数字下划线),最后以 .com 结尾或以 .com.cn 结尾 -> /^www\.\w+\.com(\.cn)?$/

5. 修饰符

  • 修饰符也叫作标志( flags )用于使用正则表达式,实现高级搜索
修饰符意义
i不区分大小写搜索
g全局搜索
  • 修饰符的使用

    1. const reg = /m/gi
    2. const reg = new RegExp('m', 'gi')

三、正则表达式和字符串

1. 正则表达式的相关方法

  • 正则表达式可以 “打点” 调用哪些方法?
方法简介
test()测试某字符串是否匹配正则表达式,返回布尔值
exec()根据正则表达式,在字符串中进行查找,返回结果数组或者 null
  1. test() 方法

    • 正则表达式的 test() 方法,用来,它返回 truefalse
    • /^[a-z]\d{3}[a-z]$/.test('a123z') === true
  2. exec() 方法

    • exec() 方法功能是:在一个指定字符串中执行一个 ,返回一个结果数组或 null

      js
      const str = 'abc123def456ghi789'
      const reg = /\d+/
      const res = reg.exec(str)  // ['123', index: 3, input: 'abc123def456ghi789', groups: undefined]
    • exec() 方法的逐条遍历

      1. exec() 方法最有趣的是, ,这意味着可以对单个字符串中的多次匹配结果进行

        js
        const str = 'abc123def456ghi789'
        const reg = /\d+/g  // + 表示贪婪,尽可能多的匹配
        const res1 = reg.exec(str)  // ['123']
        const res2 = reg.exec(str)  // ['456']
        const res3 = reg.exec(str)  // ['789']
        const res4 = reg.exec(str)  // null
        
        // 实际工作中可使用 while
        let res
        while (res = reg.exec(str)) {
          console.log(res)
        }

2. 字符串的相关方法

  • 字符串使用正则表达式的方法
方法简介
search()在字符串中根据正则表达式进行查找匹配,返回首次匹配到的位置索引,匹配不到则返回 -1
match()在字符串中根据正则表达式进行查找匹配,返回一个数组,匹配不到则返回 null
replace()使用字符串替换方法,可以使用正则表达式
split()分割字符串为数组,可以使用正则表达式