## 正则表达式知识点([中文文档](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions))
#### 创建方式
正则表达式使用单个字符串来描述
```javascript
//两种均可;
var regexObj = /abc/;
var regexObj = new RegExp("abc");
```
它有什么作用呢,简单来讲就是用来匹配规则的字符串;虽然看着很杂乱,但它却是非常强大的工具,在以后的实战项目里会经常运用到
-------
#### 标志、边界
> 正则表达式中的匹配范围: `g` 全局,`i` 忽略大小写,`m` 多行
> 边界:`\b` `^` `$`
```javascript
var regexObj = /^abc$/gi;
```
正则表达式有许多字符类和量词,需要注意的是标志和边界的用法;
* ”g“全局查询;
* ”i“ 查询不区分大小写;
* ”i“ 查询多行;
* ”^“需要匹配字符串的起始位置;
* ”$“需要匹配字符串的结束为止;
#### 字符
> 字符: `\s` 空白, `\S` 非空白, `\w` a-zA-Z0-9_,`\W` 非, `.` 除了换行的所有字符,`\d` 数字, `\D` 非数字
#### 量
> 量词: {n,m}`*` `+` `?`
* {n} n 个
* {n,} 至少n个
* {n,m} n 至 m 个
* + 1个到多个
* * 0个到多个
* ? 0个或1个
#### 分组
使用( )进行分组
| 可捕获分组 | 例 : ( A ( B ( C ) ) ) | 使用 exec() 返回的结果中存在分组的值 |
| --- | --- | --- |
| 非捕获分组 | 例: ( A (?: B ( C ) ) ) | 使用 exec() 返回的结果中不存在分组的值 |
-------
#### RegExp方法
```javascript
regexObj.test();//只返回ture或false,主要用于数据验证,并不需要得到数据本身;
regexObj.exec(str);//返回数组对象,需要注意的是数组对象的内容,因为该方法主要用于得到数据、修改数据;
```
相比于test(),exec()方法有几个重要属性;
```javascript
const str = 'The Quick Brown Fox Jumps Over The Lazy Dog';
const regexObj = /quick\s(brown).+?(jumps)/ig;
result = regexObj.exec(str);
```
| 对象 | <span class="Apple-tab-span" style="white-space:pre"></span>属性/索引 | 描述 | 例子 |
| --- | --- | --- | --- |
| result | [0] | 匹配的全部字符串 | Quick Brown Fox Jumps |
| | [1], ...[n ] | 括号中的分组捕获 | [1] = Brown , [2] = Jumps |
| | index | 匹配到的字符位于原始字符串的基于0的索引值 | 4 |
| | input | 原始字符串 | The Quick Brown Fox Jumps Over The Lazy Dog |
* result; 返回的是一个数组对象;
* result[0]; 表示匹配的子字符串,非常重要,需要牢记;
* result.index; 表示匹配的子字符串位置;非常重要,需要牢记;
* result.input; 表示字符串本身;
*****
#### 贪婪与非贪婪匹配
```javascript
var re = /abc+/;
var str = "abccccccccc";
```
那么如果需要匹配的字符串中含有abccccccccc时,re该匹配”abc“还是整段的”abccccccccc“?
结果是默认下匹配abccccccccc,也就是贪婪匹配,而非贪婪匹配方法如下:
```javascript
var re = /abc+?/;
```
下面是字符类和量词的非贪婪匹配:
* `*?` 重复任意次,但尽可能少重复
* `+?` 重复1次或更多次,但尽可能少重复
* `??` 重复0次或1次,但尽可能少重复
* `{n,m}?` 重复n到m次,但尽可能少重复
* `{n,}?` 重复n次以上,但尽可能少重复
* * * * *
尝试使用`?:` `?=` `?!`三个字符类;
```javascript
var re1 = /(a(?:b(c)))/; // 非捕获组;
var re2 = /(abc(?=def))/; // 后缀=def则匹配abc;
var re3 = /(abc(?!def))/; // 后缀≠def则匹配abc;
```
- [分享]微信小程序入门与实战
- 学习大纲
- 关于学习的一些常见问题
- 第一周
- 每周作业
- 玩练作业
- 知识点
- 正确设置PORT端口(windows/mac)
- 发布npm包
- 第二周
- 每周作业
- [作业一 (通关作业)](第二周/作业一 (通关作业).md)
- 作业二 (通关作业)
- 作业三 (通关作业)
- 作业四(可选)
- 作业五(可选)
- 知识点
- 原型链及继承的理解
- 第三周
- 每周作业
- 作业一 (通关作业)
- 作业二 (通关作业)
- 作业三 (通关作业)
- 作业四(可选)
- 知识点
- 正则表达式常用方法
- promise用法
- 常用正则表达式大全
- 第四周
- 每周作业
- 玩练作业
- 知识点
- 第五周
- 每周作业
- 作业一(通关作业)
- 作业二 (通关作业)
- 作业三(玩练作业)
- 知识点
- 第六周
- 每周作业
- [作业一(通关作业)](第六周/作业一(通关作业).md)
- 知识点
- 第七周
- 每周作业
- 作业一(玩练)
- 作业二(玩练)
- 作业三(通关)
- 作业四(通关)
- 知识点
- 第八周
- 每周作业
- 作业一(玩练)
- 作业二(玩练)
- 作业三(通关)
- 知识点
- 第九周
- 每周作业
- 作业一(玩练)
- 作业二(玩练)
- 作业三(玩练)
- 作业四(通关)
- 知识点
- 第十周
- 每周作业
- 作业一(玩练)
- 知识点