## 正則表達式知識點([中文文檔](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)
- 知識點
- 第七周
- 每周作業
- 作業一(玩練)
- 作業二(玩練)
- 作業三(通關)
- 作業四(通關)
- 知識點
- 第八周
- 每周作業
- 作業一(玩練)
- 作業二(玩練)
- 作業三(通關)
- 知識點
- 第九周
- 每周作業
- 作業一(玩練)
- 作業二(玩練)
- 作業三(玩練)
- 作業四(通關)
- 知識點
- 第十周
- 每周作業
- 作業一(玩練)
- 知識點