聊聊js里的正则表达式~

123 阅读2分钟

「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」。

一谈到正则表达式,我相信很多人都或多或少有点抗拒,因为它的语法确实有点火星文的味道 != =

但是只要掌握了,我们可以利用它大大提高代码的开发效率,因此掌握正则是十分有必要的,废话不多说,开搞!

ppx.jpg

正文

正则的定义

正则表达式用于 对字符串进行模式匹配及检索替换,是对字符串执行模式匹配的强大工具

666.jpg

正则的使用姿势

在js里,我们有两种方式来使用正则

  1. 正则字面量:形如 /^a.*z$/
  2. 正则对象: 形如 new RegExp('\\w+'),需要注意的是使用构造函数创造正则对象时,需要常规的字符转义规则(在前面加反斜杠 \),比如 new RegExp('\\w+') 等价于 /\w+/

正则里的元字符

上一节中我们看到了类似 \w 的特殊字符,它在正则里表示特殊的含义:一个数字或字母或下划线

在正则里,这种特殊字符叫做 元字符,这一类的字符有很多,不同的元字符代表不同的特殊含义,下面列举常见的元字符

  • .: 查找单个字符,除了换行和行结束符
  • \w: 查找数字、字母及下划线
  • \W: 查找非单词字符
  • \d: 查找数字
  • \D: 查找非数字字符
  • \s: 查找空白字符
  • \S: 查找非空白字符
  • \b: 匹配单词边界
  • \B: 匹配非单词边界
  • \n: 查找换行符
  • \r: 查找回车符

正则里的修饰符

正则里的修饰符用于执行区分 大小写全局匹配

  • i: 执行对大小写 不敏感 的匹配,即忽略大小写
  • g: 执行全局匹配(查找 所有匹配 而非在找到第一个匹配后停止)

正则里的方括号

方括号用于查找某个范围内的字符,常用的如下

  • [abc]: 查找a、b、c三个字符的其中之一
  • [^abc]: 查找不是a、b、c三个字符的其他任意一个字符
  • [0-9]: 查找任何从 0 至 9 的数字
  • [a-z]: 查找任何从小写 a 到小写 z 的字符

正则里的量词

所谓量词,就是指字符 出现的次数,常见的如下

  • +: 包含一个或多个
  • *: 包含任意个数
  • ?: 包含零个或一个
  • {n}: 包含n个
  • {n,m}: 包含>=n且<=m个
  • $: 表明字符串的结尾
  • ^: 表明字符串的开头

正则里的方法

正则对象提供了不同的方法,用于满足特定的需求,列举如下

  • exec: 检索字符串中指定的值,返回找到的 第一个值,注意会 无视 全局修饰符,比如
    console.log(/a/.exec('abca'))
    console.log(new RegExp('a').exec('abca'))
    /*
        ['a', index: 0, input: 'abca', groups: undefined]
            0: "a"
            groups: undefined
            index: 0
            input: "abca"
            length: 1
    */
  • test: 用于查找目标字符串中是否存在指定的值,存在返回true,否则返回false,比如
    console.log(/a/.test('abca')) //true
    console.log(new RegExp('az').test('abca')) //false

字符串对象里支持正则的方法

在字符串对象里,提供了支持正则使用方式的不同的方法,列举如下

  • search: 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,如果没有找到任何匹配的子串,则返回 -1,使用形如 string.search(searchvalue)
  • match: 在字符串内检索指定的值,或找到一个或多个正则表达式的匹配,返回匹配结果的数组,该数组的内容依赖于 regexp 是否具有全局标志 g,如果没找到匹配结果返回 null,使用形如 string.match(regexp)
  • replace: 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串,注意如果第一个参数是字符串则只替换第一个匹配的子串,如果是正则表达式则根据是否带g标识来判断是全局匹配还是单个匹配,使用形如:string.replace(searchvalue,newvalue)
  • split: 用于把一个字符串分割成字符串数组,使用形如 string.split(separator,limit),需要注意limit指定返回数组的最大长度

结语

正则表达式其实就是纸老虎,在不熟悉时觉得很难,熟悉过后就会觉得其实就那样,因此对于任何知识的学习都不要有畏难的情绪,只有内心强大了,才能征服一座座高山,好啦,over!