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

docs(regex): 增加后行断言的介绍

This commit is contained in:
ruanyf 2016-02-27 19:44:03 +08:00
parent fc7505278e
commit b77c044003

View File

@ -350,7 +350,7 @@ escape('hi. how are you?')
JavaScript语言的正则表达式只支持先行断言lookahead和先行否定断言negative lookahead不支持后行断言lookbehind和后行否定断言negative lookbehind
目前有一个提案在ES7加入后行断言。V8引擎4.9版已经支持Chrome浏览器49版打开”experimental JavaScript features“开关地址栏键入`about:flags`),就可以使用这项功能。
目前,有一个[提案](https://github.com/goyakin/es-regexp-lookbehind)在ES7加入后行断言。V8引擎4.9版已经支持Chrome浏览器49版打开”experimental JavaScript features“开关地址栏键入`about:flags`),就可以使用这项功能。
”先行断言“指的是,`x`只有在`y`前面才匹配,必须写成`/x(?=y)/`。比如,只匹配百分号之前的数字,要写成`/\d+(?=%)/`。”先行否定断言“指的是,`x`只有不在`y`前面才匹配,必须写成`x(?!y)`。比如,只匹配不在百分号之前的数字,要写成`/\d+(?!%)/`
@ -370,20 +370,22 @@ JavaScript语言的正则表达式只支持先行断言lookahead和先
上面的例子中,正则表达式的括号之中的部分,也是不计入返回结果。
但是,如果括号之中还有括号,就会当作组匹配,返回匹配结果。
”后行断言“的实现,需要先匹配`/(?<=y)x/``x`,然后再回到左边,匹配`y`的部分。这种”先右后左“的执行顺序,与所有其他正则操作相反,导致了一些不符合预期的行为。
首先,”后行断言“的组匹配,与正常情况下结果是不一样的。
```javascript
/h(?=(\w)+)/.exec("hodor") // ["h", "r"]
/(?<=(\w)+)r/.exec("hodor") // ["r", "h"]
/(?<=(\d+)(\d+))$/.exec('1053') // ["", "1", "053"]
/^(\d+)(\d+)$/.exec('1053') // ["1053", "105", "3"]
```
上面代码中,第一个正则表达式是”先行断言“,只匹配后面跟着一个多个任意字符(`\w`)的`h`,这时符合条件的右边最后一个字符,会被括号之中的那个括号捕获返回,上例是`r`。第二个正则表达式是”后行断言“,只匹配前面是一个或多个任意字符(`\w`)的`r`,这时符合条件的左边第一个字符,会被括号之中的那个括号捕获返回,上例是`h`。
上面代码中,需要捕捉两个组匹配。没有”后行断言“时,第一个括号是贪婪模式,第二个括号只能捕获一个字符,所以结果是`105``3`。而”后行断言“时,由于执行顺序是从右到左,第二个括号是贪婪模式,第一个括号只能捕获一个字符,所以结果是`1``053`。
括号之中的那个括号捕获的部分,还可以用反斜杠引用。但是,”后行断言“的反斜杠引用,与通常的顺序相反,必须在对应的那个括号之前。
其次,”后行断言“的反斜杠引用,也与通常的顺序相反,必须放在对应的那个括号之前。
```javascript
/(?<=(o)d\1)r/.exec("hodor") // null
/(?<=\1d(o))r/.exec("hodor") // ["r", "o"]
```
上面代码中,如果反斜杠引用(`\1`)在括号的后面,就不会得到匹配结果,必须放在前面才可以。
上面代码中,如果后行断言的反斜杠引用(`\1`在括号的后面,就不会得到匹配结果,必须放在前面才可以。