### 元字符
| 代碼 | 說明 |
| :-----: | ----- |
| `*` | 匹配重復任意次(包括0次)|
| `+` | 匹配一次或多次(至少一次)|
| `.` | 匹配除換行符以外的任意字符|
| `\w` | 匹配字母或數字或下劃線或漢字|
| `\s` | 匹配任意的空白符,包括空格,制表符(Tab),換行符,中文全角空格|
| `\d` | 匹配數字|
| `\b` | 匹配單詞開始或結束|
| `^` | 匹配字符串開始|
| `$` | 匹配字符串結尾|
<!--more-->
### 字符轉義
如果想要查找匹配字符本身,則需要進行字符轉義,轉義符`\`,例如:`\.`,`\*`,`\\`
### 重復
| 代碼 | 說明 |
| ----- | ----- |
| `*` | 重復0次或更多次|
| `+` | 重復1次或更多次|
| `?` | 重復0次或1次|
| `{n}` | 重復n次|
| `{n,}` | 重復n次或更多次|
| `{n,m}` | 重復n到m次|
### 字符類
在方括號`[]`里列出即可,如:
```js
[a-zA-z0-9]
[abedcdoi?!]
```
### 分支條件
用`|`將幾種規則分割開,滿足其中任意一種即匹配成功,栗子:
`0\d{2}-\d{8}|0\d{3}-\d{7}`:這個表示`0`開頭,然后`2`位數字,加`-`,加`8`位數字,或者`0`開頭,加`3`位數字,加`-`,加`7`位數字,比方:
`012-12345678`或者`0123-1234567`
注意:匹配分枝條件時,將會從左到右地測試每個條件,如果滿足了某個分枝的話,就不會去再管其它的條件了。所以特別要注意順序
### 分組
分組是通過標識符`()`來進行整體的分組匹配的,栗子:
一個簡單的ip匹配:`(\d{1,3}\.){3}\d{1,3}`
`\d{1,3}`匹配1到3位的數字,`(\d{1,3}\.){3}`匹配三位數字加上一個英文句號(這個整體也就是這個分組)重復3次,最后再加上一個一到三位的數字`(\d{1,3})`
正確的ip匹配`((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)`
### 反義符
| 代碼 | 說明 |
| ----- | ----- |
| `\W` | 匹配任意不是字母,數字,下劃線,漢字的字符|
| `\S` | 匹配任意不是空白符的字符|
| `\D` | 匹配任意非數字的字符|
| `\B` | 匹配不是單詞開頭或結束的位置|
| `[^x]` | 匹配除了x以外的任意字符|
| `[^aeiou]` | 匹配除了aeiou這幾個字母以外的任意字符|
#### 更多高級功能
#### 后項引用
使用小括號指定一個子表達式后,匹配這個子表達式的文本(也就是此分組捕獲的內容)可以在表達式或其它程序中作進一步的處理。默認情況下,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標志,第一個出現的分組的組號為1,第二個為2,以此類推。
后項引用就是:重復搜索前面某個分組匹配到的文本.
例如:
`\b(\w+)\b\s+\1\b`可以用來匹配重復的單詞,像`go go`, 或者`kitty kitty`。這個表達式首先是一個單詞,也就是單詞開始處和結束處之間的多于一個的字母或數字`(\b(\w+)\b)`,這個單詞會被捕獲到編號為1的分組中,然后是1個或幾個空白符`(\s+)`,最后是分組1中捕獲的內容(也就是前面匹配的那個單詞)`(\1)`。
你也可以自己指定子表達式的組名。要指定一個子表達式的組名,請使用這樣的語法:`(?<Word>\w+)`(或者把尖括號換成`'`也行:`(?'Word'\w+))`,這樣就把`\w+`的組名指定為`Word`了。要反向引用這個分組捕獲的內容,你可以使用`\k<Word>`,所以上一個例子也可以寫成這樣:`\b(?<Word>\w+)\b\s+\k<Word>\b`。
常用的分組:
| 分類 | 代碼 | 說明 |
| ---- | ---- | ---- |
| 捕獲 | `(exp)` | 匹配exp,并捕獲文本到自動命名的組里|
| | `(?<name>exp)` | 匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)|
| | `(?:exp)` | 匹配exp,不捕獲匹配的文本,也不給此分組分配組號|
| 零寬斷言| `(?=exp)` | 匹配exp前面的位置|
| | `(?<=exp)` | 匹配exp后面的位置|
| | `(?!exp)` | 匹配后面跟的不是exp的位置|
| | `(?<!exp)` | 匹配前面不是exp的位置|
| 注釋 | `(?#comment)` | 這種類型的分組不對正則表達式的處理產生任何影響,用于提供注釋讓人閱讀|
#### 零寬斷言
> 斷言用來聲明一個應該為真的事實。正則表達式中只有當斷言為真時才會繼續進行匹配。
> `(?=exp)`,零寬度正預測先行斷言,斷言自身出現的位置的后面能匹配表達式exp ----以xxx結尾
> `(?<=exp)`,寬度正回顧后發斷言,斷言自身出現的位置的前面能匹配表達式exp ----以xxx開頭
#### 負向零寬斷言
> `(?!exp)`,零寬度負預測先行斷言,斷言此位置的后面不能匹配表達式exp ---不以xxx結尾
> `(?<!exp)`,零寬度負回顧后發斷言,斷言此位置的前面不能匹配表達式exp ---不以xxx開頭
#### 注釋
`(?#comment)`
#### 貪婪與懶惰
#### 處理選項
#### 平衡組/遞歸匹配
#### More...
### 參考文檔
1. [正則表達式30分鐘入門指南](https://deerchao.net/tutorials/regex/regex.htm)
2. [.NET Framework 正則表達式](https://msdn.microsoft.com/zh-cn/library/hs600312.aspx)
<p class="over">Over!</p>
- 前端
- C1-Javascript
- H5圖片分塊和斷點續傳
- JavascriptPatterns[Stoyanstefanov]
- macotask和microtask
- 前端代碼生成器
- 跨域
- 頁面回到頂部滾動按鈕實現
- C2-CSS
- 瀏覽器的一些單位
- 盒模型
- 移動端判斷橫豎屏
- C3-框架
- ReactNative
- 開發環境搭建(安卓篇)
- Vue
- vue+pdfjs使用
- vue+typescript使用實踐
- vue+webpack3.x集成typescript
- Vue源碼3
- vue源碼分析1
- vue源碼分析2
- vue筆記
- C4-工具
- git
- Gitlab-CICD
- mock規則
- vscode-settings
- webpack自定義命令,切換代理地址
- 正則表達式
- 深入淺出webpack
- C5-Node
- express
- express源碼閱讀
- nightmare使用指南
- 爬蟲1.0
- C6-微信
- 微信
- C7-Canvas
- 基礎API
- 前端隨筆筆記
- 后端
- C1-Java
- shiro
- C2-Linux
- ffmpeg
- ITerm
- Linux
- MongoDB安裝
- MySql安裝
- Ngnix反向代理
- 常見錯誤
- 備忘
- mac
- 備忘-Work
- 備忘Link
- 服務器資源
- 教程
- Hexo個人博客搭建筆錄
- 文檔
- CSS編碼規范
- 前端編碼規范
- 隨筆
- 整理
- 正則
- 鏈接收藏
- 面試
- CodeWars題庫
- CodeWars題庫(二)
- Java社招面試題
- Java面試
- Web面試
- 前端筆試題
- 筆試題