docs(regex): edit regex/y flag

This commit is contained in:
ruanyf
2016-05-04 08:12:05 +08:00
parent 7d57425beb
commit 6e8505bf8c
+15 -8
View File
@@ -23,7 +23,7 @@ var regex = /xyz/i;
但是,ES5不允许此时使用第二个参数,添加修饰符,否则会报错。
```javascript
var regex = new RegExp(/xyz/, i);
var regex = new RegExp(/xyz/, 'i');
// Uncaught TypeError: Cannot supply flags when constructing one RegExp from another
```
@@ -146,7 +146,7 @@ codePointLength(s) // 2
除了`u`修饰符,ES6还为正则表达式添加了`y`修饰符,叫做“粘连”(sticky)修饰符。
y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。
`y`修饰符的作用与`g`修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,`g`修饰符只要剩余位置中存在匹配就可,而`y`修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。
```javascript
var s = 'aaa_aa_a';
@@ -224,9 +224,9 @@ REGEX.lastIndex // 4
// null
```
上面代码由于不能保证头部匹配,所以返回null。y修饰符的设计本意,就是让头部匹配的标志ˆ在全局匹配中都有效。
上面代码由于不能保证头部匹配,所以返回`null``y`修饰符的设计本意,就是让头部匹配的标志ˆ在全局匹配中都有效。
在split方法中使用y修饰符,原字符串必须以分隔符开头。这也意味着,只要匹配成功,数组的第一个成员肯定是空字符串。
`split`方法中使用y修饰符,原字符串必须以分隔符开头。这也意味着,只要匹配成功,数组的第一个成员肯定是空字符串。
```javascript
// 没有找到匹配
@@ -248,14 +248,21 @@ REGEX.lastIndex // 4
// [ '', '', '' ]
```
下面是字符串对象的replace方法的例子。
下面是字符串对象的`replace`方法的例子。
```javascript
const REGEX = /a/gy;
'aaxa'.replace(REGEX, '-') // '--xa'
```
上面代码中,最后一个a因为不是出现下一次匹配的头部,所以不会被替换。
上面代码中,最后一个`a`因为不是出现下一次匹配的头部,所以不会被替换。
单单一个`y`修饰符对`match`方法,只能返回第一个匹配,必须与`g`修饰符联用,才能返回所有匹配。
```javascript
'a1a2a3'.match(/a\d/y) // ["a1"]
'a1a2a3'.match(/a\d/gy) // ["a1", "a2", "a3"]
```
`y`修饰符的一个应用,是从字符串提取token(词元),`y`修饰符确保了匹配之间不会有漏掉的字符。
@@ -278,7 +285,7 @@ function tokenize(TOKEN_REGEX, str) {
}
```
上面代码中,如果字符串里面没有非法字符,y修饰符与g修饰符的提取结果是一样的。但是,一旦出现非法字符,两者的行为就不一样了。
上面代码中,如果字符串里面没有非法字符,`y`修饰符与`g`修饰符的提取结果是一样的。但是,一旦出现非法字符,两者的行为就不一样了。
```javascript
tokenize(TOKEN_Y, '3x + 4')
@@ -287,7 +294,7 @@ tokenize(TOKEN_G, '3x + 4')
// [ '3', '+', '4' ]
```
上面代码中,g修饰符会忽略非法字符,而y修饰符不会,这样就很容易发现错误。
上面代码中,`g`修饰符会忽略非法字符,而`y`修饰符不会,这样就很容易发现错误。
## sticky属性