diff --git a/source/_posts/JavaScript/正则表达式重新入门.md b/source/_posts/JavaScript/正则表达式重新入门(1).md similarity index 65% rename from source/_posts/JavaScript/正则表达式重新入门.md rename to source/_posts/JavaScript/正则表达式重新入门(1).md index 72a3802..1275d0c 100644 --- a/source/_posts/JavaScript/正则表达式重新入门.md +++ b/source/_posts/JavaScript/正则表达式重新入门(1).md @@ -1,5 +1,5 @@ --- -title: 正则表达式重新入门 +title: 正则表达式重新入门(1) date: 2018-12-10 16:34:42 categories: - JavaScript @@ -118,3 +118,60 @@ let reg = /\d+$/ 'abc123'.replace(reg, 'xx') //'abcxx' ``` +### 贪婪模式 +正则针对字符串从左向右进行解析, 每个部分都会尽可能多地去匹配字符, 这称之为`贪婪模式` + +例如 +```javascript +let reg = /^\d{2,5}/ +'123456'.replace(reg, 'xx') // xx6 +``` +按照这个正则的规则, 匹配2到5个数字都是可以的 +但是它实际执行的时候是按照最多的方式来匹配的, 也就是默认的匹配模式是贪婪模式 + +如果要使用非贪婪模式, 需要在量词后面加上`?` +```javascript +let reg = /^\d{2,5}?/ +'123456'.replace(reg, 'xx') // xx3456 +``` + +### 分支条件 +使用`|`来代表分支条件, 也就是匹配前后的任何一个规则即可 +比如 +![分支条件](/images/JavaScript/regex/分支条件.png) +表示字符串整体包含10个数字或者20个数字, 并且最后有2个字母 + +> 注意 : 这个 | 分割的是左右两边所有部分,而不是仅仅连着这个符号的左右两部分 +所以需要加括号, 否则会一直涵盖到表达式的边界或者遇到下一个 | + +### 断言 + +如果字符串中存在2个数字后面跟着2个字母, 就把这2个数字替换掉 +如果只是这样写\d{2}[a-zA-Z]{2} +那么后面跟着的2个字母也会被替换掉 + +要实现这种需求, 就必须用到`断言` + +由于正则是将字符串从左到右进行解析, 左侧可以称之为**头部**, 右侧可以称之为**尾部** +从头部向尾部移动可以称之为向前走 +判断前面是什么可以称之为`前瞻` +> JavaScript只支持前瞻, 而不能去判断后面是什么(后顾) + +对于上面的需求, 就可以利用断言来做了 +```javascript +let reg = /\d{2}(?=[a-zA-Z]{2})/ +'@12ab'.replace(reg, '**') // @**ab +``` + +语法规则 + +|名称|正则语法|含义| +|--|--|--| +|零宽正向前瞻|exp(?=assert)|我前面是符合assert的| +|零宽负向前瞻|exp(?!assert)|我前面的是不符合assert的| +|零宽正向后顾|exp(?<=assert)|我后面是符合assert的| +|零宽负向后顾|exp(?