Skip to content

S16-00 专题-JS-正则

[TOC]

索引【

基础

概述

我们先来看一下维基百科对正则表达式的解释:

  • 正则表达式(英语:Regular Expression,常简写为regex、regexp或RE),又称正则表示式正则表示法规则表达式常规表示法,是计算机科学的一个概念;

  • 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串**。**

  • 许多程序设计语言都支持利用正则表达式进行字符串操作。

简单概况:正则表达式是一种字符串匹配利器,可以帮助我们搜索、获取、替代字符串

在JavaScript中,正则表达式使用RegExp类来创建,也有对应的字面量的方式:

  • 正则表达式主要由两部分组成:模式(patterns)和修饰符(flags)

image-20230620151743818

基本使用

有了正则表达式我们要如何使用它呢?

  • JavaScript中的正则表达式被用于 RegExp的 exec 和 test 方法;

  • 也包括 String 的 match、matchAll、replace、search 和 split 方法;

image-20230620151803217

正则常用方法

  • RegExp
  • RegExp.prototype.exec()返回:array
  • RegExp.prototype.test(str)返回:boolean,检测某个字符串是否符合正则的规则
  • String
  • String.prototype.match()返回:
  • String.prototype.matchAll()返回:
  • String.prototype.search()返回:
  • String.prototype.replace()返回:
  • String.prototype.split()返回:

示例: test

image-20230908163503949

image-20230908163517047

示例: exec

image-20230908165552934

image-20230908165540893

示例: match

image-20230908165808719

image-20230908165800912

示例: matchAll

image-20230908165953103

image-20230908165941393

示例: replace / replaceAll

image-20230907181511081

示例: split

image-20230908170156776

image-20230908170142477

示例: search

image-20230908170333353

image-20230908170232765

修饰符

常见的修饰符:

image-20230620151813052

需求:

  • 获取一个字符串中所有的abc;

  • 将一个字符串中的所有abc换成大写;

image-20230620151828358

规则

字符类

字符类(Character classes) 是一个特殊的符号,匹配特定集中的任何符号。

  • \d,匹配任何数字 (阿拉伯数字)。相当于 [0-9]
  • \s,匹配单个空白字符,包括空格、制表符、换页符、换行符和其他 Unicode 空格。相当于 [\f\n\r\t\v]
  • \w,匹配基本拉丁字母中的任何字母数字字符,包括下划线。相当于 [A-Za-z0-9_]
  • .,匹配除行终止符之外的任何单个字符:\n, \r
  • \D,匹配任何非数字 (阿拉伯数字) 的字符。相当于[^0-9]
  • \S,匹配除空格以外的单个字符。相当于 [^\f\n\r\t\v]
  • \W,匹配任何不是来自基本拉丁字母的单词字符。相当于 [^A-Za-z0-9_]
  • \t,匹配水平制表符。
  • \r,匹配回车符。
  • \n,匹配换行符。
  • \,指示应特殊处理或“转义”后面的字符。

image-20230620151851429

断言

边界类断言

  • ^,匹配输入的开头。如果多行模式设为 true,^ 在换行符后也能立即匹配,
  • $,匹配输入的结束。如果多行模式设为 true,$ 在换行符前也能立即匹配,
  • \b,匹配一个单词的边界
  • \B,匹配非单词边界。

其他断言

  • x(?=y)先行断言: x 被 y 跟随时匹配 x。
  • x(?!y)先行否定断言: x 没有被 y 紧随时匹配 x。
  • (?<=y)x后行断言: x 跟随 y 的情况下匹配 x。
  • (?<!y)x后行否定断言: x 不跟随 y 时匹配 x。

符号 ^ 和符号 $ 在正则表达式中具有特殊的意义,它们被称为“锚点”。

  • 符号 ^ 匹配文本开头;

  • 符号 $ 匹配文本末尾;

image-20230620151910531

词边界(Word boundary)

  • 词边界 \b 是一种检查,就像 ^ 和 $ 一样,它会检查字符串中的位置是否是词边界。

  • 词边界测试 \b 检查位置的一侧是否匹配 \w,而另一侧则不匹配 “\w”

在字符串 Hello, Java! 中,以下位置对应于 \b:

image-20230620151922256

匹配下面字符串中的时间:

image-20230908180902646

image-20230908180920001

转义字符串

如果要把特殊字符作为常规字符来使用,需要对其进行转义:

  • 只需要在它前面加个反斜杠;

常见的需要转义的字符:

image-20230620151944976

  • 斜杠符号 / 并不是一个特殊符号,但是在字面量正则表达式中也需要转义;

示例: 匹配所有以.js或者.jsx结尾的文件名

image-20230620152001287

在webpack当中,匹配文件名时就是以这样的方式。

示例: 只匹配.

image-20230912154348961

image-20230912154415382

集合、范围

有时候我们只要选择多个匹配字符的其中之一就可以:

  • 在方括号 […] 中的几个字符或者字符类意味着“搜索给定的字符中的任意一个”;

集合(Sets)

  • 比如说,[eao] 意味着查找在 3 个字符 ‘a’、‘e’ 或者 ` ‘o’ 中的任意一个;

范围(Ranges)

  • 方括号也可以包含字符范围;

  • 比如说,[a-z] 会匹配从 a 到 z 范围内的字母,[0-5] 表示从 0 到 5 的数字;

  • [0-9A-F] 表示两个范围:它搜索一个字符,满足数字 0 到 9 或字母 A 到 F;

  • \d —— 和 [0-9] 相同;

  • \w —— 和 [a-zA-Z0-9_] 相同;

示例: 匹配手机号码

image-20230620152027674

js
//  手机号
/^1[3-9]\d{9}$/

排除范围:除了普通的范围匹配,还有类似[^…]的“排除”范围匹配;

量词

假设我们有一个字符串 +7(903)-123-45-67,并且想要找到它包含的所有数字。

  • 因为它们的数量是不同的,所以我们需要给与数量一个范围;

  • 用来形容我们所需要的数量的词被称为量词( Quantifiers )

语法:

  • {m} : 确切的位数:{5}

  • {m,n} : 某个范围的位数:{3,5}

注意: {m,n} 此处逗号后面不能加空格

缩写:

  • +:代表“一个或多个”,相当于 {1,}

  • ?:代表“零个或一个”,相当于 {0,1}。换句话说,它使得符号变得可选;

  • \*:代表着“零个或多个”,相当于 {0,}。也就是说,这个字符可以多次出现或不出现;

示例: 匹配开始或结束标签

image-20230620152045806

贪婪模式、惰性模式

如果我们有这样一个需求:匹配下面字符串中所有使用《》包裹的内容

image-20230620152055911

image-20230912163254643

贪婪模式( Greedy)

默认情况下的匹配规则是查找到匹配的内容后,会继续向后查找,一直找到最后一个匹配的内容,这种匹配的方式,我们称之为贪婪模式(Greedy)

惰性模式( lazy)

懒惰模式中的量词与贪婪模式中的是相反的。

  • 只要获取到对应的内容后,就不再继续向后匹配

  • 我们可以在量词后面再加一个问号 ‘?’ 来启用它

  • 所以匹配模式变为 *? 或 +?,甚至将 '?' 变为 ??

image-20230620152104313

捕获组

模式的一部分可以用括号括起来 (...),这称为“捕获组(capturing group)”。

作用:

  • 它允许将匹配的一部分作为结果数组中的单独项;

  • 它将括号视为一个整体;

方法 str.match(regexp),如果 regexp没有 g 标志,将查找第一个匹配并将它作为一个数组返回:

  • 在索引 0 处:完全匹配。

  • 在索引 1 处:第一个括号的内容。

  • 在索引 2 处:第二个括号的内容。

  • …等等…

示例: 匹配到HTML标签,并且获取其中的内容

image-20230620152118636

image-20230912164931110

image-20230912164955229

示例: 将捕获组作为整体

image-20230912165337638

image-20230912165326853

命名组:

  • 用数字记录组很困难。

  • 对于更复杂的模式,计算括号很不方便。我们有一个更好的选择:给括号起个名字。

  • 这是通过在开始括号之后立即放置?<name>来完成的。如(?<name>xxx)

image-20230912165701636

image-20230912165716137

非捕获组:

  • 有时我们需要括号才能正确应用量词,但我们不希望它们的内容出现在结果中

  • 可以通过在开头添加?:来排除组。如 (?:xxx)

image-20230620152200110

or:

or是正则表达式中的一个术语,实际上是一个简单的“”。

  • 在正则表达式中,它用竖线|表示;

  • 通常会和捕获组一起来使用,在其中表示多个值

image-20230912170217506

image-20230912170242399

or和集合的区别

  • or可以给多个字符分类:(abc|cba|nba)表示abccbanba
  • 集合只能给单个字符分类:[abc]表示abc

案例练习-歌词解析

歌词解析:http://123.207.32.32:9002/lyric?id=167876

image-20230912170807483

image-20230620152218711

案例练习-时间格式化

时间格式化:从服务器拿到时间戳,转成想要的时间格式

image-20230912175928056

image-20230620152254651

**更多正则查询:**https://c.runoob.com/front-end/854/

TypeScript【

API【

基本方法【