S16-00 专题-JS-正则
[TOC]
索引【
基础
概述
我们先来看一下维基百科对正则表达式的解释:
正则表达式(英语:Regular Expression,常简写为regex、regexp或RE),又称正则表示式、正则表示法、规则表达式、常规表示法,是计算机科学的一个概念;
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串**。**
许多程序设计语言都支持利用正则表达式进行字符串操作。
简单概况:正则表达式是一种字符串匹配利器,可以帮助我们搜索、获取、替代字符串;
在JavaScript中,正则表达式使用RegExp类来创建,也有对应的字面量的方式:
- 正则表达式主要由两部分组成:模式(patterns)和修饰符(flags)
基本使用
有了正则表达式我们要如何使用它呢?
JavaScript中的正则表达式被用于 RegExp的 exec 和 test 方法;
也包括 String 的 match、matchAll、replace、search 和 split 方法;
正则常用方法
- 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
示例: exec
示例: match
示例: matchAll
示例: replace / replaceAll
示例: split
示例: search
修饰符
常见的修饰符:
需求:
获取一个字符串中所有的abc;
将一个字符串中的所有abc换成大写;
规则
字符类
字符类(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
:,匹配换行符。
\
:,指示应特殊处理或“转义”后面的字符。
断言
边界类断言
^
:,匹配输入的开头。如果多行模式设为 true,
^
在换行符后也能立即匹配,$
:,匹配输入的结束。如果多行模式设为 true,
$
在换行符前也能立即匹配,\b
:,匹配一个单词的边界
\B
:,匹配非单词边界。
其他断言
x(?=y)
:,先行断言: x 被 y 跟随时匹配 x。
x(?!y)
:,先行否定断言: x 没有被 y 紧随时匹配 x。
(?<=y)x
:,后行断言: x 跟随 y 的情况下匹配 x。
(?<!y)x
:,后行否定断言: x 不跟随 y 时匹配 x。
符号 ^ 和符号 $ 在正则表达式中具有特殊的意义,它们被称为“锚点”。
符号 ^ 匹配文本开头;
符号 $ 匹配文本末尾;
词边界(Word boundary)
词边界 \b 是一种检查,就像 ^ 和 $ 一样,它会检查字符串中的位置是否是词边界。
词边界测试 \b 检查位置的一侧是否匹配 \w,而另一侧则不匹配 “\w”
在字符串 Hello, Java! 中,以下位置对应于 \b:
匹配下面字符串中的时间:
转义字符串
如果要把特殊字符作为常规字符来使用,需要对其进行转义:
- 只需要在它前面加个反斜杠;
常见的需要转义的字符:
- 斜杠符号
/
并不是一个特殊符号,但是在字面量正则表达式中也需要转义;
示例: 匹配所有以.js
或者.jsx
结尾的文件名
在webpack当中,匹配文件名时就是以这样的方式。
示例: 只匹配.
点
集合、范围
有时候我们只要选择多个匹配字符的其中之一就可以:
- 在方括号 […] 中的几个字符或者字符类意味着“搜索给定的字符中的任意一个”;
集合(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_] 相同;
示例: 匹配手机号码
// 手机号
/^1[3-9]\d{9}$/
排除范围:除了普通的范围匹配,还有类似[^…]
的“排除”范围匹配;
量词
假设我们有一个字符串 +7(903)-123-45-67,并且想要找到它包含的所有数字。
因为它们的数量是不同的,所以我们需要给与数量一个范围;
用来形容我们所需要的数量的词被称为量词( Quantifiers )。
语法:
{m}
: 确切的位数:{5}
{m,n}
: 某个范围的位数:{3,5}
注意: {m,n}
此处逗号后面不能加空格
缩写:
+
:代表“一个或多个”,相当于{1,}
?
:代表“零个或一个”,相当于{0,1}
。换句话说,它使得符号变得可选;\*
:代表着“零个或多个”,相当于{0,}
。也就是说,这个字符可以多次出现或不出现;
示例: 匹配开始或结束标签
贪婪模式、惰性模式
如果我们有这样一个需求:匹配下面字符串中所有使用《》包裹的内容
贪婪模式( Greedy)
默认情况下的匹配规则是查找到匹配的内容后,会继续向后查找,一直找到最后一个匹配的内容,这种匹配的方式,我们称之为贪婪模式(Greedy)
惰性模式( lazy)
懒惰模式中的量词与贪婪模式中的是相反的。
只要获取到对应的内容后,就不再继续向后匹配;
我们可以在量词后面再加一个问号 ‘?’ 来启用它;
所以匹配模式变为 *? 或 +?,甚至将 '?' 变为 ??
捕获组
模式的一部分可以用括号括起来 (...),这称为“捕获组(capturing group)”。
作用:
它允许将匹配的一部分作为结果数组中的单独项;
它将括号视为一个整体;
方法 str.match(regexp),如果 regexp没有 g 标志,将查找第一个匹配并将它作为一个数组返回:
在索引 0 处:完全匹配。
在索引 1 处:第一个括号的内容。
在索引 2 处:第二个括号的内容。
…等等…
示例: 匹配到HTML标签,并且获取其中的内容
示例: 将捕获组作为整体
命名组:
用数字记录组很困难。
对于更复杂的模式,计算括号很不方便。我们有一个更好的选择:给括号起个名字。
这是通过在开始括号之后立即放置
?<name>
来完成的。如(?<name>xxx)
非捕获组:
有时我们需要括号才能正确应用量词,但我们不希望它们的内容出现在结果中。
可以通过在开头添加
?:
来排除组。如(?:xxx)
or:
or是正则表达式中的一个术语,实际上是一个简单的“或”。
在正则表达式中,它用竖线
|
表示;通常会和捕获组一起来使用,在其中表示多个值;
or和集合的区别
- or可以给多个字符分类:
(abc|cba|nba)
表示abc
或cba
或nba
- 集合只能给单个字符分类:
[abc]
表示a
或b
或c
案例练习-歌词解析
歌词解析:http://123.207.32.32:9002/lyric?id=167876
案例练习-时间格式化
时间格式化:从服务器拿到时间戳,转成想要的时间格式
**更多正则查询:**https://c.runoob.com/front-end/854/