diff --git a/docs/regex.md b/docs/regex.md index d71c444..14ef14d 100644 --- a/docs/regex.md +++ b/docs/regex.md @@ -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属性