1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 10:22:23 +00:00

Fix code wrapper in docs/regex.md

这一篇的代码标签有点乱,我整理了一下
This commit is contained in:
Xcat Liu 2016-05-13 17:22:12 +08:00
parent 7f66176c1f
commit 732701ac35

View File

@ -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`修饰符,正则表达式就会认为字符串为两个字符,从而匹配失败。
**2Unicode字符表示法**
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
**5i修饰符**
有些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');