@@ -29,14 +29,14 @@ new RegExp(/abc/ig, 'i').flags
29
29
30
30
ES6将这4个方法,在语言内部全部调用RegExp的实例方法,从而做到所有与正则相关的方法,全都定义在RegExp对象上。
31
31
32
- - String.prototype.match 调用 RegExp.prototype[ Symbol.match]
33
- - String.prototype.replace 调用 RegExp.prototype[ Symbol.replace]
34
- - String.prototype.search 调用 RegExp.prototype[ Symbol.search]
35
- - String.prototype.split 调用 RegExp.prototype[ Symbol.split]
32
+ - ` String.prototype.match ` 调用 ` RegExp.prototype[Symbol.match] `
33
+ - ` String.prototype.replace ` 调用 ` RegExp.prototype[Symbol.replace] `
34
+ - ` String.prototype.search ` 调用 ` RegExp.prototype[Symbol.search] `
35
+ - ` String.prototype.split ` 调用 ` RegExp.prototype[Symbol.split] `
36
36
37
37
## u修饰符
38
38
39
- ES6对正则表达式添加了u修饰符 ,含义为“Unicode模式”,用来正确处理大于` \uFFFF ` 的Unicode字符。也就是说,会正确处理四个字节的UTF-16编码。
39
+ ES6对正则表达式添加了 ` u ` 修饰符 ,含义为“Unicode模式”,用来正确处理大于` \uFFFF ` 的Unicode字符。也就是说,会正确处理四个字节的UTF-16编码。
40
40
41
41
``` javascript
42
42
/ ^ \uD83D / u .test (' \uD83D\uDC2A ' )
@@ -45,7 +45,7 @@ ES6对正则表达式添加了u修饰符,含义为“Unicode模式”,用来
45
45
// true
46
46
```
47
47
48
- 上面代码中,“\uD83D\uDC2A”是一个四个字节的UTF-16编码,代表一个字符。但是,ES5不支持四个字节的UTF-16编码,会将其识别为两个字符,导致第二行代码结果为true。加了u修饰符以后,ES6就会识别其为一个字符,所以第一行代码结果为false 。
48
+ 上面代码中,“\uD83D\uDC2A”是一个四个字节的UTF-16编码,代表一个字符。但是,ES5不支持四个字节的UTF-16编码,会将其识别为两个字符,导致第二行代码结果为true。加了u修饰符以后,ES6就会识别其为一个字符,所以第一行代码结果为 ` false ` 。
49
49
50
50
一旦加上u修饰符号,就会修改下面这些正则表达式的行为。
51
51
@@ -127,11 +127,11 @@ codePointLength(s) // 2
127
127
/ [a-z ] / iu .test (' \u212A ' ) // true
128
128
```
129
129
130
- 上面代码中,不加u修饰符 ,就无法识别非规范的K字符。
130
+ 上面代码中,不加 ` u ` 修饰符 ,就无法识别非规范的K字符。
131
131
132
132
## y修饰符
133
133
134
- 除了u修饰符,ES6还为正则表达式添加了y修饰符 ,叫做“粘连”(sticky)修饰符。
134
+ 除了 ` u ` 修饰符,ES6还为正则表达式添加了 ` y ` 修饰符 ,叫做“粘连”(sticky)修饰符。
135
135
136
136
y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。
137
137
@@ -161,41 +161,50 @@ r.exec(s) // ["aa_"]
161
161
162
162
上面代码每次匹配,都是从剩余字符串的头部开始。
163
163
164
- 使用lastIndex属性,可以更好地说明y修饰符 。
164
+ 使用 ` lastIndex ` 属性,可以更好地说明 ` y ` 修饰符 。
165
165
166
166
``` javascript
167
167
const REGEX = / a/ g ;
168
168
169
- REGEX .lastIndex = 2 ; // 指定从第三个位置y开始搜索
169
+ // 指定从2号位置(y)开始匹配
170
+ REGEX .lastIndex = 2 ;
171
+
172
+ // 匹配成功
170
173
const match = REGEX .exec (' xaya' );
171
174
172
- match .index
173
- // 3
174
- REGEX .lastIndex
175
- // 4
176
- REGEX .exec (' xaxa' )
177
- // null
175
+ // 在3号位置匹配成功
176
+ match .index // 3
177
+
178
+ // 下一次匹配从4号位开始
179
+ REGEX .lastIndex // 4
180
+
181
+ // 4号位开始匹配失败
182
+ REGEX .exec (' xaxa' ) // null
178
183
```
179
184
180
- 上面代码中,lastIndex属性指定每次搜索的开始位置,g修饰符从这个位置开始向后搜索 ,直到发现匹配为止。
185
+ 上面代码中,` lastIndex ` 属性指定每次搜索的开始位置, ` g ` 修饰符从这个位置开始向后搜索 ,直到发现匹配为止。
181
186
182
- y修饰符同样遵守lastIndex属性,但是要求必须在lastIndex指定的位置发现匹配 。
187
+ y修饰符同样遵守 ` lastIndex ` 属性,但是要求必须在 ` lastIndex ` 指定的位置发现匹配 。
183
188
184
189
``` javascript
185
190
const REGEX = / a/ y ;
186
191
187
- // 第三个位置y不匹配
192
+ // 指定从2号位置开始匹配
188
193
REGEX .lastIndex = 2 ;
189
- console .log (REGEX .exec (' xaya' )); // null
190
194
191
- // 第四个位置出现匹配
195
+ // 不是粘连,匹配失败
196
+ REGEX .exec (' xaya' ) // null
197
+
198
+ // 指定从3号位置开始匹配
192
199
REGEX .lastIndex = 3 ;
200
+
201
+ // 3号位置是粘连,匹配成功
193
202
const match = REGEX .exec (' xaxa' );
194
203
match .index // 3
195
204
REGEX .lastIndex // 4
196
205
```
197
206
198
- 进一步说,y修饰符号隐含了头部匹配的标志 ˆ ; 。
207
+ 进一步说,` y ` 修饰符号隐含了头部匹配的标志 ˆ ; 。
199
208
200
209
``` javascript
201
210
/ b/ y .exec (" aba" )
@@ -235,11 +244,17 @@ const REGEX = /a/gy;
235
244
236
245
上面代码中,最后一个a因为不是出现下一次匹配的头部,所以不会被替换。
237
246
238
- 如果同时使用g修饰符和y修饰符,则y修饰符覆盖g修饰符。
239
-
240
- y修饰符的主要作用,是从字符串提取token(词元),y修饰符确保了匹配之间不会有漏掉的字符。
247
+ ` y ` 修饰符的一个应用,是从字符串提取token(词元),` y ` 修饰符确保了匹配之间不会有漏掉的字符。
241
248
242
249
``` javascript
250
+ const TOKEN_Y = / \s * (\+ | [0-9 ] + )\s * / y ;
251
+ const TOKEN_G = / \s * (\+ | [0-9 ] + )\s * / g ;
252
+
253
+ tokenize (TOKEN_Y , ' 3 + 4' )
254
+ // [ '3', '+', '4' ]
255
+ tokenize (TOKEN_G , ' 3 + 4' )
256
+ // [ '3', '+', '4' ]
257
+
243
258
function tokenize (TOKEN_REGEX , str ) {
244
259
let result = [];
245
260
let match;
@@ -248,14 +263,6 @@ function tokenize(TOKEN_REGEX, str) {
248
263
}
249
264
return result;
250
265
}
251
-
252
- const TOKEN_Y = / \s * (\+ | [0-9 ] + )\s * / y ;
253
- const TOKEN_G = / \s * (\+ | [0-9 ] + )\s * / g ;
254
-
255
- tokenize (TOKEN_Y , ' 3 + 4' )
256
- // [ '3', '+', '4' ]
257
- tokenize (TOKEN_G , ' 3 + 4' )
258
- // [ '3', '+', '4' ]
259
266
```
260
267
261
268
上面代码中,如果字符串里面没有非法字符,y修饰符与g修饰符的提取结果是一样的。但是,一旦出现非法字符,两者的行为就不一样了。
0 commit comments