---
# System prepended metadata

title: 正規表達式+replace
tags: [javascript]

---

# 正規表達式
:::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物件
![](https://hackmd.io/_uploads/BJyOQEH1T.png)
#### ▏字串物件
![](https://hackmd.io/_uploads/SkRtXEBkT.png)


### ▎**正規表達式模式 (pattern)**
![](https://hackmd.io/_uploads/SyTrQNHkp.png)

![](https://hackmd.io/_uploads/r17CXVHya.png)

常見
* 至少一個大寫字母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）、或者特殊字符（!"#$%&'()*+,./:;<=>?@[]^_\`{|}-\`）。
* `$`：表示結束。這個符號表示應在輸入的結束處停止匹配。