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