开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
相反地,选到一个称心如意的配偶,就能百年谐合,幸福无穷。我们不应该选谁来配亨利国王,他作为一国之君,…… —— 威廉 · 莎士比亚,《亨利六世上篇》(The First Part of Henry the Sixth)
正则表达式是一门简单语言的语法规范。它应用在一些方法中,对字符串中的信息实现查找、替换和提取操作。
可处理正则表达式的方法有regexp.exec、regexp.test、string.match、string.repalce、string.search 和 string.split。
7.1 一个例子
(\/{0, 3})
/ \ 表示应该匹配 / (斜杠)。它用 \ (反斜杠)来进行转义,这样它就不会被错误地解释为这个正则表达式的结束符。后缀 {0, 3} 表示 / 会被匹配 0 次。
- \d 表示一个数字字符
- - 表示这个字符类会被匹配 0 次或多次
- . 会匹配除行结束符以外的所有字符
- $ 表示这个字符串的结束
- /^ $/i 我们用 ^ 和 $ 来框定正则表达式。它指引着歌正则表达式对文本中的所有字符都进行匹配。如果我们仅包含 ^ ,它将匹配以一个数字开头的字符串。如果我们仅包含 $ ,则匹配以一个数字结尾的字符串
- i 标识表示匹配字母时忽略大小写
- \d 的含义和 [0, 9] 一样。它匹配一个数字
- 后缀 + 指引它可以匹配一个或多个数字
7.2 结构
创建一个正则表达式的方法
- 使用正则表达式字面量。正则表达式字面量被包围在一对斜杠中。
- 使用
RegExp 构造器。这个构造器接收一个字符串并把它编译为一个RegExp 对象。
RegExp 能设置 3 个标识。他们分别由字母 g、i 和 m 来标识。
表7-1: 正则表达式表示
| 标识 | 含义 |
|---|---|
| g | 全局的(匹配多次;不同的方法对g标识的处理给不相同) |
| i | 大小写不敏感(忽略字符大小写) |
| m | 多行(^ 和 $ 能匹配行结束符) |
表7-2: RegExp 对象的属性
| 属性 | 用法 |
|---|---|
| global | 如果标识 g 被使用,值为 true |
| ignoreCase | 如果标识 i 被使用,值为 true |
| lastIndex | 下一次 exec 匹配开始的索引。初始值为 0 |
| multiline | 如果标识 m 被使用,值为 true |
| source | 正则表达式源码文本 |
7.3 元素
让我们进一步看看那些构成正则表达式的元素。
7.3.1 正则表达式分支
一个正则表达式分支包含一个或多个正则表达式序列。这些序列被 |(竖线)字符分隔。如果这些序列中的任何一项符合匹配条件,那么这个选择就被匹配。它尝试按顺序依次匹配这些序列项。
"into".match(/in|int/)
会在 into 中匹配 in。但它不会匹配 int,因为 in 已被成功匹配了。
7.3.2 正则表达式序列
- 一个正则表达式序列包含一个或多个正则表达式因子。
- 每个因子能选择是否跟随一个量词,这个量词决定着这个因子被允许出现的次数。
- 如果没有指定这个量词,那么该因子只会被匹配一次。
7.3.3 正则表达式因子
一个正则表达式因子可以是一个字符、一个由圆括号包围的组、一个字符类,或者是一个转义序列。除了控制字符和特殊字符以外,所有的字符都会被按照字面处理:
\ / [ ] ( ) { } ? + * | . ^ $
如果你希望上面👆列出的字符按字面去匹配,那么必须要用一个 \ 前缀来进行转义。
注意: \ 前缀不能使用字母或数字字面化.
注意:一个未被转义的 . 会匹配除行结束符以外的任何字符。
7.3.4 正则表达式转义
| 标识 | 含义 |
|---|---|
| \f | 换页符 |
| \n | 换行符 |
| \r | 回车符 |
| \t | 制表符 |
| \u | 允许指定一个 Unicode 字符来标识一个十六进制的常量 |
| \b | 在正则表达式因子中,\b 不是退格符,它方便用于对文本的字边界进行匹配 |
| \d | 等同于[0-9],它匹配一个数字。 |
| \D | 表示与其相反的[^0-9] |
| \s | 等同于[\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]。这是Unicode 空白符的一个不完全子集 |
| \S | 表示与其相反的[^\f\n\r\t\u000B\u0020\u00A0\u2028\u2029] |
| \w | 等同于[0-9A-Z_a-z] |
| \W | 表示与其相反的[^0-9A-Z_a-z] |
7.3.5 正则表达式分组
分组共有4种:
-
捕获型: 一个捕获型分组是一个被包围在圆括号种的正则表达式分支。任何匹配这个分组的字符都会被捕获。每个捕获型分组都被指定了一个数字。在正则表达式中第 1 个捕获(的是分组 1,第 2 个捕获(的是分组 2。
-
非捕获型: 非捕获型分组有一个(?: 前缀。非捕获型分组仅做简单的匹配,并不会捕获所匹配的文本。非捕获型分组不会干扰捕获型分组的编号。
-
向前正向匹配: 向前正向匹配分组有一个(?= 前缀。它类似于非捕获型分组,但在这个组匹配后,文本会倒回到它开始的地方,实际上并不匹配任何东西。
-
向前负向匹配: 向前负向匹配分组有一个(?! 前缀。它类似于向前正向匹配分组,只有当它匹配失败时它才继续向前进行匹配。
7.3.6 正则表达式字符集
正则表达式字符集是一种指定一组字符的便利方式。
例如,如果想匹配一个元音字母,我们可以写作 (? : a | e | i | o | u),但它可以被方便地写成一个类[aeiou]
类提供了两外另个便利:
-
能指定字符范围。
一组由
32 个 ASCII的特殊字符组成的集合:! " # $ % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ ` { | } ~ -
可以进行类的求反。
7.3.7 正则表达式字符转义
字符类内部的转义规则和表达式因子的相比稍有不同。此处的[\b]是退格符。下面在字符类中需要被转义的特殊字符:
- / [ \ ] ^
7.3.8 正则表达式量词
正则表达式因子可以用一个正则表达式量词后缀来决定这个因子应该被匹配的次数。包围在一对花括号中的一个数字表示这个因子应该被匹配的次数。所以 /www/ 匹配的和 /为 /w{3}/ 一样,{3, 6} 会匹配3、4、5 或 6 次,{3, } 会被匹配 3 次或更多次。
?等同于 {0, 1},* 等同于 {0, },+ 则等同于 {1, }