# 正規表達式
:::success
https://vimsky.com/zh-tw/article/3603.html
https://ithelp.ithome.com.tw/articles/10221016
https://ithelp.ithome.com.tw/articles/10094951
https://fannys23.pixnet.net/blog/post/47526081
:::
## ▊ 寫法
用兩個`/`包住來表達
```javascript
// 寫法1
var reg = /正規表達式/ [, 旗標];
var re = /^[0-9]{10}$/;
// 寫法2
var reg = new RegExp (正規表達式[, 旗標]);
var re = new RegExp(/^[0-9]{10}$/);
```
### ▎函式
#### ▏RegExp物件

#### ▏字串物件

### ▎**正規表達式模式 (pattern)**


常見
* 至少一個大寫字母English letter:`?=.*?[A-Z]`
* 至少一個小寫英文字母:`?=.*?[a-z]`
* 至少有一位數字:`?=.*?[0-9]`
* 至少有一個特殊字符:`?=.*?[#?!@$%^&*-]`
* 最小八個長度:`{8,}`(帶錨)
其他
* `/a/` 表示輸入的字元中要有 a 這個字元。
* `/^a/`表示開頭要以 a 開頭,所以 `/Aaa/` 會為 false。
* `/^ab/` 會找出 ab 開頭。
* `/ab$/` 會找出 ab 結尾。
* `/[0-9a-z]/` 會找出包含0~9以及 a~z 的格式,但不包含 A~Z。
* `/[09]`/ 只會找出有有包含09的格式。
* `/a./` 會找出 a 後面有字元的格式。
* `/.a/` 會找出 a 前面有字元的格式。
* `/[a-z0-9]{8}/` 會找出有有8個字元的格式。
* `/a|b/` 找出包含 a 或 b 的格式。
* `/a*/` 會找出有0~多個有 a 的格式,但因為0個也為 true,所以 `/bbbbbbb/` 也為 true。
* `/a+/` 會找出有1~多個有 a 的格式,因為一定要一個,所以 `/bbbbbbb/` 會變 false。
* `/\d/`代表 `[0-9]` 的意思,因為有些驗證格式比較嚴謹,需要很長串的英數混合,一直打 `[0-9]` 也很麻煩...
* `/\w/` 代表 `[0-9a-zA-Z_]` 的意思。理由大概同上。
## ▊ 搭配 `String.prototype.replace()` 使用
:::info
[Mdn web docs 的介紹](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace)
:::
### ▎用法
```javascript
str.replace(pattern, replacement)
```
#### ▏如果 pattern 是空字符,則替換項會插入字串的開頭。
```javascript
"xxx".replace("", "_"); // "_xxx"
```
#### ▏指定字串作為替換項
可以包括以下特殊替換模式:
| 模式 |插入值 |
| -------- | -------- |
| `$$` | 插入一个 `"$"`。 |
|`$&`| 插入匹配的子字串。 |
| ``$` `` | 插入匹配子字符串之前的字串片段。 |
| `$'` | 插入匹配子字串之後的字串片段。 |
| `$n` | 插入第 `n`(索引从 1 開始)個捕獲組,其中 `n` 是 < 100 的正整数。 |
| `$<Name>` | 插入 group name 為 `Name` 的捕獲組。 |
`$n`和`$<Name>`只能在 pattern 為 RegExp 時使用
```javascript
"foo".replace(/(f)/, "$2");
// "$2oo";正则表达式没有第二个组
"foo".replace("f", "$1");
// "$1oo";pattern 是一个字符串,所以它没有任何组
"foo".replace(/(f)|(g)/, "$2");
// "oo";第二个组存在但未匹配
```
### ▎範例
:::warning
解釋是用AI寫的
:::
1. MAC 格式
```javascript
const macAddressRegex = /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/;
```
MAC 地址是由 12 個由 0 到 F 組成的數字,每兩個數字之間用冒號 `:` 隔開。以下是這個正規表達式的詳細解釋:
* `^`:這個符號表示開始。它確保匹配必須從輸入的開始處開始。
* `([0-9A-Fa-f]{2}[:-])`:這個部分匹配兩個由 0 到 F 組成的數字,後面跟著一個冒號或者破折號。`[0-9A-Fa-f]` 匹配任何數字或者字母(無論大小寫),`{2}` 確保剛好匹配兩個,`[:-]` 匹配冒號或者破折號。
* `{5}`:這個部分確保前面的模式重複 5 次,也就是說,有 5 組由兩個數字和一個冒號或者破折號組成的序列。
* `([0-9A-Fa-f]{2})`:這個部分匹配最後的兩個由 0 到 F 組成的數字。這是 MAC 地址的最後一部分。
* `$`:這個符號表示結束。它確保匹配必須在輸入的結束處結束。
所以,這個正規表達式匹配的是一個標準的 MAC 地址,例如 "01:23:45:67:89:AB" 或者 "01-23-45-67-89-AB"。
2. email 格式
```javascript
const emailReg = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
```
* `^`:表示開始。這個符號表示應從輸入的開始處進行匹配。
* `[a-zA-Z0-9._%+-]+`:這部分匹配電子郵件地址的本地部分(即 @ 符號之前的部分)。它可以包含一個或多個(由 + 表示)小寫字母(a-z)、大寫字母(A-Z)、數字(0-9)、點(.)、下劃線(_)、百分號(%)、加號(+)或減號(-)。
* `@`:這部分匹配電子郵件地址中的 @ 符號。
* `[a-zA-Z0-9.-]+`:這部分匹配電子郵件地址的域名部分(即 @ 符號之後的部分)。它可以包含一個或多個(由 + 表示)小寫字母(a-z)、大寫字母(A-Z)、數字(0-9)、點(.)或減號(-)。
* `\.`:這部分匹配電子郵件地址中的點(.)符號。
* `[a-zA-Z]{2,}`:這部分匹配電子郵件地址的頂級域名(即最後一個點之後的部分)。它可以包含兩個或更多(由 {2,} 表示)小寫字母(a-z)或大寫字母(A-Z)。
* `$`:表示結束。這個符號表示應在輸入的結束處停止匹配。
3. password 格式
```javascript
const passwordReg =
/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d!\u0022#$%&'()*+,./:;<=>?@[\]^_`{|}~-]{8,20}$/;
```
這個正規表達式用於驗證一個字符串是否符合密碼的一般格式,即至少包含一個字母、一個數字,長度在8到20個字符之間,並且只包含特定的字符。
* `^`:表示開始。這個符號表示應從輸入的開始處進行匹配。
* `(?=.*[A-Za-z])`:這是一個前瞻斷言,表示密碼必須至少包含一個字母(不區分大小寫)。
* `(?=.*\d)`:這是另一個前瞻斷言,表示密碼必須至少包含一個數字。
* `[A-Za-z\d!\u0022#$%&'()*+,./:;<=>?@[\]^_{|}-]{8,20}`:這部分表示密碼必須是8到20個字符長,並且只能包含以下字符:小寫字母(a-z)、大寫字母(A-Z)、數字(0-9)、或者特殊字符(!"#$%&'()*+,./:;<=>?@[]^_\`{|}-\`)。
* `$`:表示結束。這個符號表示應在輸入的結束處停止匹配。