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:
parent
7f66176c1f
commit
732701ac35
@ -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');
|
||||
|
Loading…
x
Reference in New Issue
Block a user