正则表达式、RegExp

206 阅读2分钟

1. 正则表达式

1.1. 什么是

规定一个字符串中字符出现规律的规则

1.2. 何时
  1. 按照指定规则模糊查找一类关键词时
  2. 表单中验证输入项的格式
1.3. 语法

1.3.1. 最简单的正则表达式, 是关键词原文本身

1.3.2.字符集
  • 什么是: 规定一位字符可用的备选字符列表的集合

  • 何时: 只要一位字符, 有多种可能备选字时

  • 如何: [备选字符列表]

  • 强调: 一个字符集只能规定一位字符的备选字符列表

  • 简写: 如果字符列表中部分字符是连续的, 可用 - 省略中间字符

    • [0-9]: 一位数字
    • [a-z]: 一位小写字母
    • [A-Z]: 一位大写字母
    • [A-Za-z]: 一位字母
    • [0-9A-Za-z]: 一位字母或数字
    • [\u4e00-\u9fa5]: 一位汉字
  • 特殊: 除了: [^排除的字符列表]

    • 强调: ^ 必须写在 [ 开头 ]

1.3.3. 预定义字符集
  • 什么是: 对常用字符集的简写 -> 4 个
    1. \d: 一位数字 -> [0-9]
    2. \w: 一个字母 / 数字 / _ -> [0-9A-Za-z_]
    3. \s: 一位空字符 -> 空格 / tab
    4. .: 通配符 -> 一个任意字符
1.3.4. 量词

专门规定相邻的前一个字符集出现次数的规则

  • 何时: 只要规定字符集出现的位数 / 次数
  • 如何: 量词必须紧跟在字符集之后, 修饰相邻的前一个字符集
  • 包括: 2 大类
    1. 有明确数量边界的:
      • 字符集{n,m}: 至少 n 个, 最多 m 个
      • 字符集{n,}: 至少 n 个, 多了不限
      • 字符集{n}: 必须 n 个
    2. 没有明确数量边界的:
      • 字符集?: 可有可无, 最多 1 个
      • 字符集*: 可有可无, 多了不限
      • 字符集+: 至少一个, 多了不限
1.3.5. 选择和分组
  1. 选择:

多个规则, 只要匹配其一即可

  • 语法: 规则1 | 规则2 | ...

  • 强调: | 在正则中, 优先级最低

  1. 分组:

() 将多个规则分为一组

  • 何时: 如果希望量词同时修饰多个字符集时, 就要先将多个字符集分为一组, 再用量词修饰分组
  • 为什么: 默认字符集仅修饰相邻的前一个字符集
  • Ex:
    1. 身份证号: 15 位数字 + 2 位数字 + 1 位数字或Xx
      • /\d{15}(\d\d[\d|Xx])?/
    2. 手机号:
      • 规则: 1. +86 / 0086 -> 可有可无,最多一次 2. 空字符可有可无, 多了不限 3. 1 4. 3, 4, 5, 7, 8 选一个 5. 9位数字
      • /(\+(00)?(86)?)?\s*1[34578]\d{9}/
    3. 屏蔽 微信 / weixin / wx
      • (微|W|w(ei)?)\s*(信|X|x(in)?)
1.3.6. 指定匹配位置: 3 种
  1. ^: 字符串开头 -> Ex: 字符串开头的空字符: ^\s+
  2. $: 字符串结尾 -> Ex: 字符串结尾的空字符: \s+$
    • Ex: 开头或结尾的空字符 -> ^\s+|\s+$
    • 固定套路: 1. 只要希望字符串和正则从头到尾完全匹配 -> 同时前加 ^ 后加 $ 2. 只要用正则表达式执行验证时, 必须前加 ^ 后加 $
  3. \b: 单词边界
    • 单词首字母: \b[a-zA-Z]
    • 单词尾字母: [a-zA-Z]\b
    • 单独的一个单词 no: \bno\b

2. RegExp

2.1. 什么是

专门封装一条正则表达式, 并使用正则表达式执行查找和验证的 API

2.2. 何时
  1. 使用正则表达式验证用户输入的格式
  2. 即查找关键词内容, 又查找关键词位置
2.3. 如何
2.3.1. 创建: 2 种
  1. 直接量: var reg = /正则/ig

    • 何时: 如果正则表达式是固定不变的

    • 强调: // 之中如果再出现 /, 就必须改为 \/

  2. new: var reg = new RegExp("正则","ig")

    • 何时: 如果正则表达式需要动态拼接生成

    • 强调: "" 中再出现 \", 都要改为 \\\"

2.3.2. API: 2个
  1. 即查找内容, 又查找位置:
    • var arr = reg.exec(str): 在 str 中查找下一个符合 reg 规则的关键词
    • 返回值: 返回一个数组 arr
      • arr[0]: 本次找到的关键词的内容
        • 如果正则中有分组:
          • arr[n]: 自动保存第 n 个分组匹配的子内容
      • arr["index"]: 本次找到的关键词的位置
      • 如果没找到, 返回 null
    • 原理: 每次查找3件事
      1. 将本次找到的关键词保存在 arr 的 0 位置
      2. 将本次找到的关键词位置保存在 arrindex 位置
      3. 每个 reg 对象都有一个 lastIndex 属性, 标识下次开始的查找位置 -> 开始时为 0 每执行完一次 exec, exec 会自动修改 lastIndex 为: 当前位置 + 关键词长度**
  2. 验证格式:
    • var bool = reg.test(str): 验证 str 是否符合 reg 规则要求
    • 验证通过返回 true, 不通过返回 false
    • 问题: 默认正则只要找到部分匹配就返回 true
      • 解决: 凡是验证, 必须前加 ^, 后加 $