JS正则表达式-学习笔记

896 阅读10分钟

RegExp

正则表达式

作用

  • 校验文本
  • 替换文本
  • 提取文本

语法

  • 字面量
    • /pattern/flags
  • 构造函数
    • new RegExp(pattern[, flags])
let r1 = /ab+c/i // 字面量
let r2 = new RegExp('ab+c', 'i') // 构造函数

修饰符

字符 含义
i 忽略大小写
g 全局匹配
m 多行匹配

匹配方式

字符集合

字符 含义
[xyz] 一个字符集合,也叫字符组。匹配集合中的任意一个字符。可以使用连字符-指定一个范围
[^xyz] 一个反义或补充字符集,也叫反义字符组。匹配任意一个不在括号内的字符。也可以使用连字符-指定一个范围
x|y 匹配|任意一侧的字符(xy
[0-9] 匹配一个09范围内的任意数字
[a-z] 匹配一个az范围内的任意字符
[A-Z] 匹配一个AZ范围内的任意字符
[\u4E00-\u9FA5] 匹配一个汉字

元字符

字符 含义
. 匹配任意单个字符,但是行结束符除外:[^\r\n]。在字符集中,点.失去其特殊含义,并匹配一个字面点.。需要注意的是,m多行标志不会改变点号的表现。因此为了匹配多行中的字符集,可使用[^],它将会匹配任意字符,包括换行符
\d 匹配一个数字。等价于[0-9]
\w 匹配一个单词字符,包括字母、数字、下划线。等价于[A-Za-z0-9_]
\s 匹配一个空白符,包括空格、制表符、换页符、换行符和其他 Unicode 空格。等价于[ \t\r\n\v​​\f]
\t 匹配一个水平制表符 \x09
\r 匹配一个回车符 \x0d
\n 匹配一个换行符 \x0a
\v 匹配一个垂直制表符 \x0b
\f 匹配一个换页符 \x0c
\D 匹配一个非数字 [^0-9]
\W 匹配一个非单词字符 [^0-9A-Z_a-z]
\S 匹配一个非空白符 [^ \t\r\n\v​​\f]
[\b] 匹配一个退格符(不要与\b混淆)
\0 匹配一个NUL字符
\xhh 匹配编码为hh(两个十六进制数字)的字符
\uhhhh 匹配 Unicode 值为hhhh(四个十六进制数字)的字符
\ 转义
\cX 匹配字符串中的一个控制字符。XA-Z的一个字母。/\cM/匹配字符串中的control-M

量词

字符 含义
x* 匹配前面的模式x 0或多次。等价于x{0,}
x+ 匹配前面的模式x 1或多次。等价于x{1,}
x? 匹配前面的模式x 0或1次。等价于x{0,1}
x{n} n是一个正整数。前面的模式x连续出现n次时匹配
x{n,} n是一个正整数。前面的模式x连续出现至少n次时匹配
x{n,m} nm为正整数。前面的模式x连续出现至少n次,至多m次时匹配
x*?
x+?
x??
x{n}?
x{n,}?
x{n,m}?
像上面一样匹配前面的模式x,然而匹配是最小可能匹配(即非贪婪模式匹配,而上面的是贪婪模式)

分组和反向引用

字符 含义
(x) 匹配 x 并且捕获匹配项。这被称为捕获括号。被匹配的子字符串可以在结果数组的元素 [1], ..., [n] 中找到,或在被定义的 RegExp 对象的属性 $1, ..., $9 中找到
\n n 是一个正整数。一个反向引用,指向正则表达式中第 n 个括号(从左开始数)中匹配的子字符串
(?:x) 匹配 x 不会捕获匹配项。这被称为非捕获括号
(?<Name>x) 命名捕获组。匹配 x,并以 <Name> 指定的名称将其存储在返回匹配项的 groups 属性中(matches.groups.Name

边界

字符 含义
^ 匹配输入开始。如果多行标志被设为 true,该字符也会匹配一个断行符后的开始处
$ 匹配输入结尾。如果多行标志被设为 true,该字符也会匹配一个断行符前的结尾处
\b 匹配一个零宽单词边界,如一个字母与一个空格之间(不要和 [\b] 混淆)
\B 匹配一个零宽非单词边界,如两个字母之间或两个空格之间

断言

字符 含义
x(?=y) 仅匹配被 y 跟随的 x
x(?!y) 仅匹配不被 y 跟随的 x
(?<=y)x x 只有在 y 后面才匹配
(?<!y)x x 只有不在 y 后面才匹配

特殊字符

字符 描述
[] 中括号表达式,限定匹配范围
{} 限定符表达式,限定匹配次数
() 标记一个子表达式,并保存匹配结果供后续使用
* 匹配子表达式0次或多次
+ 匹配子表达式1次或多次
? 匹配子表达式0次或1次
. 任意单个字符(除换行符\n\r
\ 转义或标记字符(\\\n
| 限定匹配可选项
^ 匹配开头位置(如果再方括号表达式中,表示集合取反)
$ 匹配结尾位置

优先级

字符 描述
\ 转义符
()
(?:)
(?=)
[]
圆括号和方括号
*
+
?
{n}
{n,}
{n,m}
限定符
^
$
\元字符
任意字符
定位和序列
| 或操作符 m|food mood|food (m|f)ood

示例

  • RegExp
    • test
    • exec
  • String
    • replace
    • search
    • match
    • split
/[0-9]+/.test('abc123') // true
/[a-z]+/.exec('123abc') // ['abc', index: 3, input: '123abc', groups: undefined]
'123abcABC'.replace(/[A-Z]+/, '!') // 123abc!
'123abcABC'.search(/[A-Z]+/) // 6
'123abc456'.match(/\d+/g) // ['123', '456']
'123abc456'.split(/[a-z]+/) // ['123', '456']
// 首尾
'abc123 456def g78h 9ij0'.match(/^[a-z]{3}/) // ['abc', index: 0, input: 'abc123 456def g78h 9ij0', groups: undefined]
'abc123 456def g78h 9ij0'.match(/\d$/) // ['0', index: 22, input: 'abc123 456def g78h 9ij0', groups: undefined]
// 单词边界
'abc123 456def g78h 9ij0'.match(/\b\d{1,3}/g) // ['456', '9']
'abc123 456def g78h 9ij0'.match(/\d{1,3}\b/g) // ['123', '0']
// 断言
'abc123 456def g78h 9ij0'.match(/\d{1,3}(?=[a-z]{1,3})/g) // ['456', '78', '9']
'abc123 456def g78h 9ij0'.match(/\d{1,3}(?![a-z]{1,3})/g) // ['123', '45', '7', '0']
'abc123 456def g78h 9ij0'.match(/(?<=[a-z]{1,3})\d{1,3}/g) // ['123', '78', '0']
'abc123 456def g78h 9ij0'.match(/(?<![a-z]{1,3})\d{1,3}/g) // ['23', '456', '8', '9']
'abc123 456def\ng78h 9ij0'.match(/^[a-z]{1,3}/mg)
// ['abc', 'g']
'abc123 456def\ng78h 9ij0'.match(/^[a-z]{3}(\d{3})[^]*9([a-z]{2})0$/m)
// [
//   'abc123 456def\ng78h 9ij0',
//   '123',
//   'ij',
//   index: 0,
//   input: 'abc123 456def\ng78h 9ij0',
//   groups: undefined
// ]
'abc123 456def\ng78h 9ij0'.match(/^[a-z]{3}(?:\d{3})[^]*9([a-z]{2})0$/m)
// [
//   'abc123 456def\ng78h 9ij0',
//   'ij',
//   index: 0,
//   input: 'abc123 456def\ng78h 9ij0',
//   groups: undefined
// ]
'abc123 456def\ng78h 9ij0'.match(/^[a-z]{3}(?:\d{3})[^]*9(?:[a-z]{2})0$/m)
// [
//   'abc123 456def\ng78h 9ij0',
//   index: 0,
//   input: 'abc123 456def\ng78h 9ij0',
//   groups: undefined
// ]
'abc123 456def\ng78h 9ij0'.match(/^[a-z]{3}(?<one>\d{3})[^]*9(?<two>[a-z]{2})0$/m)
// [
//   'abc123 456def\ng78h 9ij0',
//   '123',
//   'ij',
//   index: 0,
//   input: 'abc123 456def\ng78h 9ij0',
//   groups: [Object: null prototype] { one: '123', two: 'ij' }
// ]
'abc123 456def\ng78h 9ij0'.match(/^[a-z]{3}(\d{3})[^]*9(?<two>[a-z]{2})0$/m)
// [
//   'abc123 456def\ng78h 9ij0',
//   '123',
//   'ij',
//   index: 0,
//   input: 'abc123 456def\ng78h 9ij0',
//   groups: [Object: null prototype] { two: 'ij' }
// ]
'abc123 456def\ng78h 9ij0'.match(/^[a-z]{3}(?:\d{3})[^]*9(?<two>[a-z]{2})0$/m)
// [
//   'abc123 456def\ng78h 9ij0',
//   'ij',
//   index: 0,
//   input: 'abc123 456def\ng78h 9ij0',
//   groups: [Object: null prototype] { two: 'ij' }
// ]
'abc123 abc456 456abc'.replace(/^([a-z]{3})\d{3} \1(\d{3}) \2\1$/, '$2,$1')
// 456,abc

附录

ASCII

Dec Oct Hex 字符 描述
0 00 0x00 NUL(null) 空字符
1 01 0x01 SOH 标题开始
2 02 0x02 STX 正文开始
3 03 0x03 ETX 正文结束
4 04 0x04 EOT 传输结束
5 05 0x05 ENQ 请求
6 06 0x06 ACK 收到通知
7 07 0x07 BEL 响铃
8 010 0x08 BS(backspace) 退格
9 011 0x09 HT 水平制表符
10 012 0x0A LF 换行键
11 013 0x0B VT 垂直制表符
12 014 0x0C FF 换页键
13 015 0x0D CR 回车键
14 016 0x0E SO 不用切换
15 017 0x0F SI 启用切换
--- --- ---- --- ---
16 020 0x10 DLE 数据链路转义
17 021 0x11 DC1 设备控制1
18 022 0x12 DC2 设备控制2
19 023 0x13 DC3 设备控制3
20 024 0x14 DC4 设备控制4
21 025 0x15 NAK 拒绝接收
22 026 0x16 SYN 同步空闲
23 027 0x17 ETB 结束传输块
24 030 0x18 CAN 取消
25 031 0x19 EM 媒介结束
26 032 0x1A SUB 代替
27 033 0x1B ESC 换码(溢出)
28 034 0x1C FS 文件分隔符
29 035 0x1D GS 分组符
30 036 0x1E RS 记录分隔符
31 037 0x1F US 单元分隔符
--- --- ---- --- ---
32 040 0x20 (space) 空格
33 041 0x21 ! 叹号
34 042 0x22 " 双引号
35 043 0x23 # 井号
36 044 0x24 $ 美元符
37 045 0x25 % 百分号
38 046 0x26 & 与号
39 047 0x27 ' 单引号
40 050 0x28 ( 开括号
41 051 0x29 ) 闭括号
42 052 0x2A * 星号
43 053 0x2B + 加号
44 054 0x2C , 逗号
45 055 0x2D - 减号
46 056 0x2E . 句号
47 057 0x2F / 斜杠
--- --- ---- --- ---
48 060 0x30 0 字符0
49 061 0x31 1 字符1
50 062 0x32 2 字符2
51 063 0x33 3 字符3
52 064 0x34 4 字符4
53 065 0x35 5 字符5
54 066 0x36 6 字符6
55 067 0x37 7 字符7
56 070 0x38 8 字符8
57 071 0x39 9 字符9
--- --- ---- --- ---
58 072 0x3A : 冒号
59 073 0x3B ; 分号
60 074 0x3C < 小于
61 075 0x3D = 等号
62 076 0x3E > 大于
63 077 0x3F ? 问号
--- --- ---- --- ---
64 100 0x40 @ 电子邮件符号
--- --- ---- --- ---
65 101 0x41 A 大写字母A
66 102 0x42 B 大写字母B
67 103 0x43 C 大写字母C
68 104 0x44 D 大写字母D
69 105 0x45 E 大写字母E
70 106 0x46 F 大写字母F
71 107 0x47 G 大写字母G
72 110 0x48 H 大写字母H
73 111 0x49 I 大写字母I
74 112 0x4A J 大写字母J
75 113 0x4B K 大写字母K
76 114 0x4C L 大写字母L
77 115 0x4D M 大写字母M
78 116 0x4E N 大写字母N
79 117 0x4F O 大写字母O
--- --- ---- --- ---
80 120 0x50 P 大写字母P
81 121 0x51 Q 大写字母Q
82 122 0x52 R 大写字母R
83 123 0x53 S 大写字母S
84 124 0x54 T 大写字母T
85 125 0x55 U 大写字母U
86 126 0x56 V 大写字母V
87 127 0x57 W 大写字母W
88 130 0x58 X 大写字母X
89 131 0x59 Y 大写字母Y
90 132 0x5A Z 大写字母Z
--- --- ---- --- ---
91 133 0x5B [ 开方括号
92 134 0x5C \ 反斜杠
93 135 0x5D ] 闭方括号
94 136 0x5E ^ 脱字符
95 137 0x5F _ 下划线
--- --- ---- --- ---
96 140 0x60 ` 开单引号
--- --- ---- --- ---
97 141 0x61 a 小写字母a
98 142 0x62 b 小写字母b
99 143 0x63 c 小写字母c
100 144 0x64 d 小写字母d
101 145 0x65 e 小写字母e
102 146 0x66 f 小写字母f
103 147 0x67 g 小写字母g
104 150 0x68 h 小写字母h
105 151 0x69 i 小写字母i
106 152 0x6A j 小写字母j
107 153 0x6B k 小写字母k
108 154 0x6C l 小写字母l
109 155 0x6D m 小写字母m
110 156 0x6E n 小写字母n
111 157 0x6F o 小写字母o
--- --- ---- --- ---
112 160 0x70 p 小写字母p
113 161 0x71 q 小写字母q
114 162 0x72 r 小写字母r
115 163 0x73 s 小写字母s
116 164 0x74 t 小写字母t
117 165 0x75 u 小写字母u
118 166 0x76 v 小写字母v
119 167 0x77 w 小写字母w
120 170 0x78 x 小写字母x
121 171 0x79 y 小写字母y
122 172 0x7A z 小写字母z
--- --- ---- --- ---
123 173 0x7B { 开花括号
124 174 0x7C | 垂线
125 175 0x7D } 闭花括号
126 176 0x7E ~ 波浪号
127 177 0x7F DEL(delete) 删除

符号实体

实体编号 实体名称 显示 结果 描述
&#34; &quot; " " 引号
&#38; &amp; & & 和号
&#39; &apos; ' ' 撇号
&#60; &lt; < < 小于号
&#62; &gt; > > 大于号
&#160; &nbsp;   空格(space)
--------- ---------- ------- --- ---
&#165; &yen; ¥ ¥
&#169; &copy; © © 版权
&#174; &reg; ® ® 注册商标
&#183; &middot; · · 中间点
&#215; &times; × × 乘号
&#247; &divide; ÷ ÷ 除号
&#8194; &ensp; 空格(1/2个汉字宽度)
&#8195; &emsp; 空格(1个汉字宽度)
--------- ---------- ------- --- ---
&#8216; &lsquo; 左单引号
&#8217; &rsquo; 右单引号
&#8220; &ldquo; 左双引号
&#8221; &rdquo; 右双引号
&#8226; &bull; 圆点
&#8242; &prime;
&#8243; &Prime;
--------- ---------- ------- --- ---
&#8592; &larr; 左箭头
&#8593; &uarr; 上箭头
&#8594; &rarr; 右箭头
&#8595; &darr; 下箭头
&#8596; &harr; 左右箭头
--------- ---------- ------- --- ---
&#8800; &ne; 不等于
&#8801; &equiv; 等价
&#8804; &le; 小于等于
&#8805; &ge; 大于等于
&#8901; &sdot; 点运算符
--------- ---------- ------- --- ---
&#9824; &spades; 黑桃
&#9827; &clubs; 梅花
&#9829; &hearts; 红心
&#9830; &diams; 方块