This commit is contained in:
sookie 2018-12-21 16:56:55 +08:00
parent 8c68e9dd1f
commit 18c54b4c40
2 changed files with 58 additions and 1 deletions

View File

@ -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(?<!assert)|我后面是不符合assert的|
如同^代表开头,$代表结尾,\b代表单词边界一样前瞻断言和后顾断言也有类似的作用它们只匹配某些位置
在匹配过程中,不占用字符,所以被称为`零宽`

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB