diff --git a/docs/regex.md b/docs/regex.md index 14ef14d..5a66f1b 100644 --- a/docs/regex.md +++ b/docs/regex.md @@ -58,13 +58,13 @@ ES6对正则表达式添加了`u`修饰符,含义为“Unicode模式”,用 // true ``` -上面代码中,“\uD83D\uDC2A”是一个四个字节的UTF-16编码,代表一个字符。但是,ES5不支持四个字节的UTF-16编码,会将其识别为两个字符,导致第二行代码结果为true。加了u修饰符以后,ES6就会识别其为一个字符,所以第一行代码结果为`false`。 +上面代码中,`\uD83D\uDC2A`是一个四个字节的UTF-16编码,代表一个字符。但是,ES5不支持四个字节的UTF-16编码,会将其识别为两个字符,导致第二行代码结果为`true`。加了`u`修饰符以后,ES6就会识别其为一个字符,所以第一行代码结果为`false`。 -一旦加上u修饰符号,就会修改下面这些正则表达式的行为。 +一旦加上`u`修饰符号,就会修改下面这些正则表达式的行为。 **(1)点字符** -点(.)字符在正则表达式中,含义是除了换行符以外的任意单个字符。对于码点大于`0xFFFF`的Unicode字符,点字符不能识别,必须加上u修饰符。 +点(`.`)字符在正则表达式中,含义是除了换行符以外的任意单个字符。对于码点大于`0xFFFF`的Unicode字符,点字符不能识别,必须加上`u`修饰符。 ```javascript var s = '𠮷'; @@ -73,11 +73,11 @@ var s = '𠮷'; /^.$/u.test(s) // true ``` -上面代码表示,如果不添加u修饰符,正则表达式就会认为字符串为两个字符,从而匹配失败。 +上面代码表示,如果不添加`u`修饰符,正则表达式就会认为字符串为两个字符,从而匹配失败。 **(2)Unicode字符表示法** -ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达式中必须加上u修饰符,才能识别。 +ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达式中必须加上`u`修饰符,才能识别。 ```javascript /\u{61}/.test('a') // false @@ -85,11 +85,11 @@ ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达 /\u{20BB7}/u.test('𠮷') // true ``` -上面代码表示,如果不加u修饰符,正则表达式无法识别`\u{61}`这种表示法,只会认为这匹配61个连续的u。 +上面代码表示,如果不加`u`修饰符,正则表达式无法识别`\u{61}`这种表示法,只会认为这匹配61个连续的`u`。 **(3)量词** -使用u修饰符后,所有量词都会正确识别大于码点大于`0xFFFF`的Unicode字符。 +使用`u`修饰符后,所有量词都会正确识别大于码点大于`0xFFFF`的Unicode字符。 ```javascript /a{2}/.test('aa') // true @@ -98,24 +98,24 @@ ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达 /𠮷{2}/u.test('𠮷𠮷') // true ``` -另外,只有在使用u修饰符的情况下,Unicode表达式当中的大括号才会被正确解读,否则会被解读为量词。 +另外,只有在使用`u`修饰符的情况下,Unicode表达式当中的大括号才会被正确解读,否则会被解读为量词。 ```javascript /^\u{3}$/.test('uuu') // true ``` -上面代码中,由于正则表达式没有u修饰符,所以大括号被解读为量词。加上u修饰符,就会被解读为Unicode表达式。 +上面代码中,由于正则表达式没有`u`修饰符,所以大括号被解读为量词。加上`u`修饰符,就会被解读为Unicode表达式。 **(4)预定义模式** -u修饰符也影响到预定义模式,能否正确识别码点大于`0xFFFF`的Unicode字符。 +`u`修饰符也影响到预定义模式,能否正确识别码点大于`0xFFFF`的Unicode字符。 ```javascript /^\S$/.test('𠮷') // false /^\S$/u.test('𠮷') // true ``` -上面代码的`\S`是预定义模式,匹配所有不是空格的字符。只有加了u修饰符,它才能正确匹配码点大于0xFFFF的Unicode字符。 +上面代码的`\S`是预定义模式,匹配所有不是空格的字符。只有加了`u`修饰符,它才能正确匹配码点大于`0xFFFF`的Unicode字符。 利用这一点,可以写出一个正确返回字符串长度的函数。 @@ -133,7 +133,7 @@ codePointLength(s) // 2 **(5)i修饰符** -有些Unicode字符的编码不同,但是字型很相近,比如,\u004B与\u212A都是大写的K。 +有些Unicode字符的编码不同,但是字型很相近,比如,`\u004B`与`\u212A`都是大写的K。 ```javascript /[a-z]/i.test('\u212A') // false @@ -160,7 +160,7 @@ r1.exec(s) // ["aa"] r2.exec(s) // null ``` -上面代码有两个正则表达式,一个使用`g`修饰符,另一个使用`y`修饰符。这两个正则表达式各执行了两次,第一次执行的时候,两者行为相同,剩余字符串都是`_aa_a`。由于g修饰没有位置要求,所以第二次执行会返回结果,而y修饰符要求匹配必须从头部开始,所以返回`null`。 +上面代码有两个正则表达式,一个使用`g`修饰符,另一个使用`y`修饰符。这两个正则表达式各执行了两次,第一次执行的时候,两者行为相同,剩余字符串都是`_aa_a`。由于`g`修饰没有位置要求,所以第二次执行会返回结果,而`y`修饰符要求匹配必须从头部开始,所以返回`null`。 如果改一下正则表达式,保证每次都能头部匹配,`y`修饰符就会返回结果了。 @@ -197,7 +197,7 @@ REGEX.exec('xaxa') // null 上面代码中,`lastIndex`属性指定每次搜索的开始位置,`g`修饰符从这个位置开始向后搜索,直到发现匹配为止。 -y修饰符同样遵守`lastIndex`属性,但是要求必须在`lastIndex`指定的位置发现匹配。 +`y`修饰符同样遵守`lastIndex`属性,但是要求必须在`lastIndex`指定的位置发现匹配。 ```javascript const REGEX = /a/y; @@ -217,16 +217,16 @@ match.index // 3 REGEX.lastIndex // 4 ``` -进一步说,`y`修饰符号隐含了头部匹配的标志ˆ。 +进一步说,`y`修饰符号隐含了头部匹配的标志`^`。 ```javascript /b/y.exec('aba') // null ``` -上面代码由于不能保证头部匹配,所以返回`null`。`y`修饰符的设计本意,就是让头部匹配的标志ˆ在全局匹配中都有效。 +上面代码由于不能保证头部匹配,所以返回`null`。`y`修饰符的设计本意,就是让头部匹配的标志`^`在全局匹配中都有效。 -在`split`方法中使用y修饰符,原字符串必须以分隔符开头。这也意味着,只要匹配成功,数组的第一个成员肯定是空字符串。 +在`split`方法中使用`y`修饰符,原字符串必须以分隔符开头。这也意味着,只要匹配成功,数组的第一个成员肯定是空字符串。 ```javascript // 没有找到匹配 @@ -298,7 +298,7 @@ tokenize(TOKEN_G, '3x + 4') ## sticky属性 -与y修饰符相匹配,ES6的正则对象多了sticky属性,表示是否设置了y修饰符。 +与`y`修饰符相匹配,ES6的正则对象多了`sticky`属性,表示是否设置了`y`修饰符。 ```javascript var r = /hello\d/y; @@ -307,7 +307,7 @@ r.sticky // true ## flags属性 -ES6为正则表达式新增了flags属性,会返回正则表达式的修饰符。 +ES6为正则表达式新增了`flags`属性,会返回正则表达式的修饰符。 ```javascript // ES5的source属性 @@ -335,7 +335,7 @@ escapeRegExp(str) // "\/path\/to\/resource\.html\?search=query" ``` -上面代码中,str是一个正常字符串,必须使用反斜杠对其中的特殊字符转义,才能用来作为一个正则匹配的模式。 +上面代码中,`str`是一个正常字符串,必须使用反斜杠对其中的特殊字符转义,才能用来作为一个正则匹配的模式。 已经有[提议](https://esdiscuss.org/topic/regexp-escape)将这个需求标准化,作为RegExp对象的静态方法[RegExp.escape()](https://github.com/benjamingr/RexExp.escape),放入ES7。2015年7月31日,TC39认为,这个方法有安全风险,又不愿这个方法变得过于复杂,没有同意将其列入ES7,但这不失为一个真实的需求。 @@ -358,7 +358,7 @@ var regex = new RegExp(RegExp.escape(str), 'g'); assert.equal(String(regex), '/hello\. how are you\?/g'); ``` -目前,该方法可以用上文的escapeRegExp函数或者垫片模块[regexp.escape](https://github.com/ljharb/regexp.escape)实现。 +目前,该方法可以用上文的`escapeRegExp`函数或者垫片模块[regexp.escape](https://github.com/ljharb/regexp.escape)实现。 ```javascript var escape = require('regexp.escape');