體驗正則表達式的魅力:css
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // 獲取字符串中全部的數值 let str = 'cyy2020cyy2xxx'; //不使用正則的狀況 let nums = [...str].filter(item => !Number.isNaN(parseInt(item))).join(''); console.log(nums); // 使用正則的狀況 let num2 = str.match(/\d/g).join(''); console.log(num2); </script> </body> </html>
字面量建立正則表達式:html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> let str = 'cyy2020cyy2xxx'; console.log(/cyy/.test(str)); //不能直接使用變量 let word = 'cyy'; console.log(/word/.test(str)); //使用這種方式,使用變量 console.log(eval(`/${word}/`).test(str)); </script> </body> </html>
使用對象建立正則表達式:正則表達式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <div>這裏是cyy用來檢測正則的測試文本~~~</div> <script> // let str = 'cyy2020cyy2xxx'; // //第二個參數是模式 // let reg = new RegExp('cyy', 'g'); // console.log(reg.test(str)); // //使用變量 // let word = 'cyy'; // let reg2 = new RegExp(word, 'g'); // console.log(reg2.test(str)); //demo let text = prompt('請輸入要檢測的文本,支持正則'); let reg = new RegExp(text, 'g'); let div = document.querySelector('div'); div.innerHTML = div.innerHTML.replace(reg, search => { return `<span style="color:red;">${search}</span>`; }); </script> </body> </html>
選擇符的使用:數組
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> let str = 'cyy000'; // |表明選擇符,符號左邊的表達式或者右邊的表達式是否知足 // 左邊匹配的是cyy,而不是一個y console.log(/cyy|x/.test(str)); let tel = '010-8888888'; console.log(/^(010|020)\-\d{7,8}$/.test(tel)); </script> </body> </html>
原子表與原子組中的選擇符:瀏覽器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // 原子表 let str = '1122334455'; let reg = /[1234567]/; console.log(str.match(reg)); //原子組 let str2 = '1122334455'; let reg2 = /(11|44)/g; console.log(str2.match(reg2)); </script> </body> </html>
轉義須要好好理解:less
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // .表明除換行符外的全部字符 // let price = 33.47; // console.log(/\d+\.\d+/.test(price)); //對象建立的正則須要雙重轉義 // let price = 33.47; // let reg = new RegExp('\d+\.\d+'); // console.log(reg); // console.log(reg.test(price)); let price = 33.47; let reg = new RegExp('\\d+\\.\\d+'); console.log(reg); console.log(reg.test(price)); </script> </body> </html>
字符邊界約束:測試
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <input type="text" name='user'> <span style='color:red;'></span> <script> document.querySelector('[name=user]').addEventListener('keyup', function () { console.log(this.value); let flag = this.value.match(/^[a-z]{3,5}$/); document.querySelector('span').innerHTML = flag ? '成功' : '失敗'; }); </script> </body> </html>
數值與空白元字符:優化
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // let str = '20201111'; // console.log(str.match(/\d/)); // // 模式符g 全局匹配 // console.log(str.match(/\d/g)); //獲取電話號碼 // let tel = "'姓名: 'cyy', 電話: 010-1111111; 姓名: 'cyy2', 電話: 030-99999999"; // console.log(tel.match(/\d{3}-\d{7,8}/g)); //獲取中文 [^]表示方括號裏面的都不要 let tel = "'姓名: 'cyy', 電話: 010-1111111; 姓名: 'cyy2', 電話: 030-99999999"; console.log(tel.match(/[^':,-\da-z\s;]+/g)); //\d 數字 \D 非數字 // let tel = "'姓名: 'cyy', 電話: 010-1111111; 姓名: 'cyy2', 電話: 030-99999999"; // console.log(tel.match(/\D+/g)); // \s匹配空白,包括空格和換行符 // let str = ' 11\n'; // console.log(str.match(/\s/g)); // \S匹配非空白,包括空格和換行符 let str = ' 11\n'; console.log(str.match(/\S+/g)); </script> </body> </html>
w與W元字符:網站
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // \w 字母數字下劃線 // let str = 'cyy123_-@@'; // console.log(str.match(/\w+/)); // let email = '965794175@qq.com'; // console.log(email.match(/^\w+@\w+\.\w+$/)); // 5-10爲字母數字下劃線,而且是字母開頭 let user = prompt('請輸入用戶名'); console.log(user.match(/^[a-z]\w{4,9}$/)); </script> </body> </html>
點元字符的使用:ui
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // . 除空白符以外的全部字符 // let str = 'cswj+4!j@;;'; // console.log(str.match(/.+/)); //這裏的+是貪婪模式 // .須要轉義 // let str = 'https://www.baidu.com'; // console.log(str.match(/^https?:\/\/\w+\.\w+\.\w+$/)); // .須要轉義 // let str = ` // www.baidu.com // www.taobao.com // `; // console.log(str.match(/.+/)); // // s模式符:忽略換行符 // console.log(str.match(/.+/s)); let tel = '010 - 12345678'; console.log(tel.match(/\d{3} - \d{8}/)); console.log(tel.match(/\d{3}\s-\s\d{8}/)); </script> </body> </html>
如何精巧的匹配全部字符:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> let str = ` <span> cyy @@@ hahahah </span> `; console.log(str.match(/[\w\W]+/)); console.log(str.match(/[\d\D]+/)); </script> </body> </html>
i與g模式修飾符:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> let str = 'cyyCyy'; console.log(str.match(/c/i)); console.log(str.match(/c/g)); console.log(str.match(/c/gi)); console.log(str.replace(/c/gi, '@')); </script> </body> </html>
m多行匹配修正符實例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> let str = ` #1 js,200元 # #2 html,104元 # #3 css # cyy `; let lessons = str.match(/^\s*#\d+\s+.+\s+#$/gm).map(item => { item = item.replace(/^\s*#\d+\s*/, '').replace(/\s+#/, ''); [name, price] = item.split(','); return { name, price }; }); console.log(lessons); </script> </body> </html>
漢字與字符屬性:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // u修飾符:正確處理四個字符的 UTF-16 編碼 //每一個字符都有屬性,如L屬性表示是字母,P 表示標點符號,須要結合 u 模式纔有效。 //其餘屬性簡寫能夠訪問 https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt 網站查看。 // let str = 'cyy2020.永遠最棒棒~'; // console.log(str.match(/\p{L}/gu));//字母 // console.log(str.match(/\p{N}/gu));//數字 // console.log(str.match(/\p{P}/gu));//標點符號 //找中文 //字符也有unicode文字系統屬性 Script=文字系統,下面是使用 \p{sc=Han} 獲取中文字符 han爲中文系統 //其餘語言請查看 http://www.unicode.org/standard/supported.html // console.log(str.match(/\p{sc=Han}/gu)); let str = '𝒳𝒴'; console.log(str.match(/[𝒳𝒴]/));//單獨匹配時亂碼 console.log(str.match(/[𝒳𝒴]/u));//正確識別寬字節 </script> </body> </html>
lastIndex屬性的做用:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> let str = 'cyy is a girl'; // console.log(str.match(/\w/)); // console.log(str.match(/\w/g)); //沒有組信息 //非全局模式下lastIndex不會向後走 // let reg = /\w/; // console.log(reg.exec(str)); // console.log(reg.lastIndex); // console.log(reg.exec(str)); // console.log(reg.lastIndex); // console.log(reg.exec(str)); // console.log(reg.lastIndex); //全局模式下lastIndex會向後走 let reg = /\w/g; // console.log(reg.exec(str)); // console.log(reg.lastIndex); // console.log(reg.exec(str)); // console.log(reg.lastIndex); // console.log(reg.exec(str)); // console.log(reg.lastIndex); while (res = reg.exec(str)) { console.log(res); } </script> </body> </html>
有效率的y模式:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // y粘連模式,必須連續 // let str = 'yycyyccc'; // let reg = /yy/g; // console.log(reg.exec(str)); // console.log(reg.lastIndex); // console.log(reg.exec(str)); // console.log(reg.lastIndex); // console.log(reg.exec(str)); // console.log(reg.lastIndex); // let reg = /yy/y; // console.log(reg.exec(str)); // console.log(reg.lastIndex); // console.log(reg.exec(str)); // console.log(reg.lastIndex); // console.log(reg.exec(str)); // console.log(reg.lastIndex); let str = 'cyy的qq羣是:1111111,2222222,3333333,cyy的年齡是:18'; let reg = /(\d+),?/y; reg.lastIndex = 9; // console.log(reg.exec(str)); // console.log(reg.exec(str)); // console.log(reg.exec(str)); let qq = []; while (res = reg.exec(str)) { qq.push(res[1]); } console.log(qq); </script> </body> </html>
原子表基本上使用:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // let str = '123456'; // console.log(str.match(/[246]/g)); // let str = '2020-11-28'; // let str2 = '2020/11/28'; // console.log(str.match(/^\d{4}[-\/]\d{2}[-\/]\d{2}$/g)); // console.log(str2.match(/^\d{4}[-\/]\d{2}[-\/]\d{2}$/g)); //分隔符必須一致 let str = '2020-11/28'; let str2 = '2020/11/28'; console.log(str.match(/^\d{4}([-\/])\d{2}\1\d{2}$/g)); console.log(str2.match(/^\d{4}([-\/])\d{2}\1\d{2}$/g)); </script> </body> </html>
區間匹配:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <input type="text" name='user'> <script> // let str = '1234'; // console.log(str.match(/[0-9]+/g)); // let str = 'abcd1234'; // console.log(str.match(/[a-z]+/g)); let input = document.querySelector('[name=user]'); input.addEventListener('keyup', function () { console.log(this.value.match(/[a-z]\w{3,5}/)); }) </script> </body> </html>
排除匹配:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // let str = '1234'; // console.log(str.match(/[12]/g)); // console.log(str.match(/[^12]/g)); let str = 'cyy是小仙女呀'; console.log(str.match(/[^\w]+/g)); console.log(str.match(/\p{sc=Han}+/gu)); </script> </body> </html>
原子表字符不解析:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> let str = '(cyy.)'; // ()在這裏表明原子組 // console.log(str.match(/()/g)); // ()在這裏表明普通括號 // console.log(str.match(/[()]/g)); // .在這裏表示除空白符外的全部字符 console.log(str.match(/.+/g)); // .在這裏表示.符號自己 console.log(str.match(/[.+]/g)); </script> </body> </html>
使用原子表匹配全部內容:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> let str = ` cyy1 cyy2 `; console.log(str.match(/.+/));//沒法匹配換行符 console.log(str.match(/.+/s));//能夠匹配換行符 console.log(str.match(/[\s\S]+/)); console.log(str.match(/[\d\D]+/)); console.log(str.match(/[\w\W]+/)); </script> </body> </html>
正則操做DOM:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <p>p</p> <h1>h1</h1> <h3>h3</h3> <script> let reg = /<(h[1-6])>[\s\S]*<\/\1>/gi; document.body.innerHTML = document.body.innerHTML.replace(reg, ''); </script> </body> </html>
認識原子組:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> let str = `<h1>h1</h1> <h2>h2</h2>`; let reg = /<(h[1-6])>[\s\S]*<\/\1>/gi; console.log(str.match(reg)); </script> </body> </html>
郵箱驗證中原子組的使用:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <input type="email" name="email" value="965794175@qq.com.cn"> <script> let reg = /[\w-]+@([\w-]+\.)+(com|cn|cc|net|org)/gi; let email = document.querySelector('[name=email]').value; console.log(email.match(reg)); </script> </body> </html>
原子組引用完成替換操做:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> let str = ` <h1>h1</h1> <div>div</div> <h3>h3</h3>`; //把h1-h6替換成p let reg = /<(h[1-6])>([\s\S]+)<\/\1>/gi; console.log(str.match(reg)); console.log(str.replace(reg, `<p>$2</p>`)); let res = str.replace(reg, (p0, p1, p2) => { // console.log(p0, p1, p2); return `<p>${p2}</p>`; }); console.log(res); </script> </body> </html>
嵌套分組與不記錄組:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> let str = ` https://www.baidu.com http://www.baidu.com https://baidu.com `; //獲取域名 // ? 表示無關緊要 // 圓括號裏 ?: 表示不記錄組 let reg = /https?:\/\/((?:\w+\.)?\w+\.(?:com|cn|net|org|cc))/gi; // console.log(reg.exec(str)); let urls = []; while (res = reg.exec(str)) { // console.log(res); urls.push(res[1]);//0是原數組,1是第一個分組 } console.log(urls); </script> </body> </html>
多種重複匹配基本使用:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // let str = 'cyy'; // + 1個或者多個,貪婪匹配 // console.log(str.match(/cy+/)); // let str = 'c'; // * 0個或者多個,貪婪匹配 // console.log(str.match(/cy*/)); // let str = 'cy'; // // ? 0個或者1個,貪婪匹配 // console.log(str.match(/cy?/)); let str = 'cyy'; // {} 表示範圍,貪婪匹配 console.log(str.match(/cy{2,5}/)); </script> </body> </html>
重複匹配對原子組的影響與電話號正則:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // let str = 'cyyyyycycycy'; // console.log(str.match(/(cy)+/g)); let tel = '010-1234567'; console.log(tel.match(/^0\d{2,3}-\d{7,8}$/g)); </script> </body> </html>
網站用戶名驗證 :
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <input type="text" name='username'> <script> document.querySelector('[name=username]').addEventListener('keyup', (e) => { let value = e.target.value; //用戶名3-8位,字母數字下劃線,字母開頭 console.log(value.match(/^[a-z][\w-]{2,7}$/i)); }) </script> </body> </html>
批量使用正則完成密碼驗證:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <input type="text" name='pwd'> <script> document.querySelector('[name=pwd]').addEventListener('keyup', (e) => { let value = e.target.value; //密碼是數字或者字母5-10位,而且必須包含大寫字母和數字 let regs = [ /^[a-z0-9]{5,10}$/i, /[A-Z]/, /\d/ ]; let res = regs.every(reg => reg.test(value)); console.log(res); }); </script> </body> </html>
禁止貪婪:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> let str = 'cyyyyyy'; // console.log(str.match(/cy+/));//默認貪婪 // console.log(str.match(/cy+?/));//禁止貪婪 // console.log(str.match(/cy*/));//默認貪婪 // console.log(str.match(/cy*?/));//禁止貪婪 // console.log(str.match(/cy{2,6}/));//默認貪婪 // console.log(str.match(/cy{2,6}?/));//禁止貪婪 // console.log(str.match(/cy{2,}/));//默認貪婪 // console.log(str.match(/cy{2,}?/));//禁止貪婪 console.log(str.match(/cy?/));//默認貪婪 console.log(str.match(/cy??/));//禁止貪婪 </script> </body> </html>
標籤替換的禁止貪婪使用:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <main> <span>cyy1</span> <span>cyy2</span> <span>cyy3</span> </main> <script> //把span換成h4,標紅,前綴加上小可愛- const main = document.querySelector('main'); // ?禁止貪婪 let reg = /<span>([\s\S]+?)<\/span>/ig; main.innerHTML = main.innerHTML.replace(reg, (res, h1) => { return `<h4 style="color:red;">小可愛-${h1}</h4>`; }); </script> </body> </html>
使用matchAll完成全局匹配:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <h1>cyy1</h1> <h2>cyy2</h2> <h3>cyy3</h3> <script> let reg = /<(h[1-6])>([\s\S]+?)<\/\1>/ig; console.log(document.body.innerHTML.match(reg)); console.log(document.body.innerHTML.matchAll(reg)); let res = document.body.innerHTML.matchAll(reg); let arr = []; for (const iterator of res) { console.dir(iterator); arr.push(iterator[2]); } console.table(arr); </script> </body> </html>
爲低端瀏覽器定義原型方法matchAll
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <h1>cyy1</h1> <h2>cyy2</h2> <h3>cyy3</h3> <script> String.prototype.matchAll = function (reg) { let res = this.match(reg); // console.log(res); if (res) { let str = this.replace(res[0], '^'.repeat(res[0].length)); let match = str.matchAll(reg) || []; return [res, ...match]; } } let body = document.body.innerHTML; let res = body.matchAll(/<(h[1-6])>([\s\S]+?)<\/\1>/ig); console.log(res); </script> </body> </html>
使用exec完成全局匹配:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <h1>cyy1</h1> <h2>cyy2</h2> <h3>cyy3</h3> <script> // let str = 'cyyccyy'; // let reg = /y/gi;//必須加上g修飾符,lastIndex纔會發生改變 // console.log(reg.exec(str)); // console.log(reg.lastIndex); // console.log(reg.exec(str)); // console.log(reg.lastIndex); // console.log(reg.exec(str)); // console.log(reg.lastIndex); // console.log(reg.exec(str)); // console.log(reg.lastIndex); // console.log(reg.exec(str)); // console.log(reg.lastIndex); // let arr = []; // while (res = reg.exec(str)) { // arr.push(res); // } // console.log(arr); let arr = []; function search(str, reg) { while (res = reg.exec(str)) { arr.push(res); } return arr; } search(document.body.innerHTML, /<(h[1-6])>[\s\S]+?<\/\1>/gi); console.log(arr); </script> </body> </html>
字符串正則方法search與match
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // search 字符串的搜索 // let str = 'yyccyy'; // console.log(str.search('c')); // console.log(str.search(/c/g)); // match 字符串的匹配 // let str = 'yyccyy'; // console.log(str.match('c')); // console.log(str.match(/c/g)); let str = ` https://www.baidu.com http://www.taobao.com.cn https://google.cn `; let reg = /https?:\/\/(\w+\.)?(\w+\.)+(com|cn|net|org|cc)/gi; console.log(str.match(reg)); </script> </body> </html>
字符串正則方法matchAll與split
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // search 字符串的搜索 // let str = 'yyccyy'; // console.log(str.search('c')); // console.log(str.search(/c/g)); // match 字符串的匹配 // let str = 'yyccyy'; // console.log(str.match('c')); // console.log(str.match(/c/g)); // let str = ` // https://www.baidu.com // http://www.taobao.com.cn // https://google.cn // `; // let reg = /https?:\/\/(\w+\.)?(\w+\.)+(com|cn|net|org|cc)/gi; // console.log(str.match(reg)); // let reg = /https?:\/\/(?:\w+\.)?(?:\w+\.)+(?:com|cn|net|org|cc)/gi; // let res = str.matchAll(reg); // for (const iterator of res) { // console.log(iterator); // } let str = '2020-11-30'; let str2 = '2020/11/30'; console.log(str.split(/[-\/]/)); console.log(str2.split(/[-\/]/)); </script> </body> </html>
$符在正則替換中的使用:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // let str = '2020/11/30'; // console.log(str.replace(/[\/]/, '-')); // console.log(str.replace(/[\/]/g, '-')); // let str = '(010)99999999 (020)8888888'; // let reg = /\((\d{3,4})\)(\d{7,8})/g; // console.log(str.match(reg)); // console.log(str.replace(reg, "$1-$2")); let str = '=cyy='; // $& 匹配到的內容 $` 匹配內容的左邊 $' 匹配內容的右邊 console.log(str.replace(/cyy/, "$`可愛$&可愛$'")); </script> </body> </html>
$&使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <main>cyy喜歡吃炒年糕,cyy也喜歡吃湯年糕</main> <script> const main = document.querySelector('main'); main.innerHTML = main.innerHTML.replace(/年糕/g, "<a href='http://www.baidu.com'>$&</a>") </script> </body> </html>
原子組在替換中的使用技巧:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <main> <a href="http://www.baidu.com" style='color:pink'>baidu</a> <a id='link' href="http://baidu.com">baidu</a> <a href="http://google.com">baidu</a> <h4>http://www.baidu.com</h4> </main> <script> const main = document.querySelector('main'); let reg = /(<a.*href=['"])(http)(:\/\/)(www\.)?(baidu)/gi; main.innerHTML = main.innerHTML.replace(reg, (v, ...args) => { console.log(args); args[1] += 's'; args[3] = args[3] || 'www.'; return args.splice(0, 5).join(''); }); </script> </body> </html>
原子組別名:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> let str = ` <h1>h1</h1> <span>span</span> <h4>h4</h4> `; // let reg = /<(h[1-6])>(.*?)<\/\1>/gi; // console.log(str.replace(reg, "<div>$2</div>")); //起別名 let reg = /<(h[1-6])>(?<con>.*?)<\/\1>/gi; console.log(str.replace(reg, "<div>$<con></div>")); </script> </body> </html>
使用原子組別名優化正則:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <main> <a href="https://www.baidu.com">baidu</a> <a href="https://www.taobao.com">taobao</a> <a href="https://www.google.com">google</a> </main> <script> // [{link:,title:}] const main = document.querySelector('main'); // let reg = /<a.*?href=(['"])(?<link>.*?)\1>(?<title>.*?)<\/a>/i; // console.log(main.innerHTML.match(reg)); let reg = /<a.*?href=(['"])(?<link>.*?)\1>(?<title>.*?)<\/a>/gi; let arr = []; for (const iterator of main.innerHTML.matchAll(reg)) { console.log(iterator['groups']); arr.push(iterator['groups']); } console.table(arr); </script> </body> </html>
正則方法test
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <input type="text" name='email'> <script> const mail = document.querySelector('[name=email]'); mail.addEventListener('keyup', (e) => { let value = e.target.value; let res = /^[\w-]+@[\w+\.]+(com|cn|org|cc)$/i.test(value); console.log(res); }) </script> </body> </html>
正則方法exec
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <main> cyy很是可愛,cyy到底有多可愛?baidu.com </main> <script> const mail = document.querySelector('main').innerHTML; let reg = /cyy/gi; // console.log(mail.match(reg)); // console.log(reg.exec(mail)); // console.log(reg.lastIndex); // console.log(reg.exec(mail)); // console.log(reg.lastIndex); // console.log(reg.exec(mail)); // console.log(reg.lastIndex); let count = 0; while (res = reg.exec(mail)) { count++; } console.log(count); </script> </body> </html>
?= 斷言匹配:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <main> cyy很是可愛,cyy可愛就可愛在…… </main> <script> const main = document.querySelector('main'); let reg = /cyy(?=可愛)/gi; main.innerHTML = main.innerHTML.replace(reg, '<a href="https://www.baidu.com">$&</a>'); </script> </body> </html>
使用斷言規範價格:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // 給全部金錢補上 .00 格式 let lessons = ` js,200元,300次 html,300.00元,105次 css,140元,260次 `; let reg = /(\d+)(\.00)?(?=元)/gi; let res = lessons.replace(reg, (v, ...args) => { console.log(args); args[1] = args[1] || '.00'; return args.splice(0, 2).join(''); }); console.table(res); </script> </body> </html>
?<= 斷言匹配
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <main> <a href="https://www.baidu.com">baidu</a> <a href="https://www.google.com">google</a> </main> <script> // let str = 'cyy123ccc098'; // let reg = /(?<=cyy)\d+/gi; // console.log(str.match(reg)); const main = document.querySelector('main'); const reg = /(?<=href=(["'])).+(?=\1)/gi; // console.log(main.innerHTML.match(reg)); main.innerHTML = main.innerHTML.replace(reg, 'http://www.taobao.com'); </script> </body> </html>
使用斷言模糊電話號:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> let users = ` cyy1電話:12345678911 cyy2電話:99999678911 `; let reg = /(?<=\d{7})\d{4}/gi; users = users.replace(reg, '*'.repeat(4)); console.log(users); </script> </body> </html>
?!斷言匹配:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // ?= 後面是什麼 // ?! 後面不是什麼 let str = 'cyy2020ccc'; let reg = /[a-z]+(?!\d)/gi; // 錯誤 let reg = /[a-z]+(?!\d)$/gi; // 正確 console.log(str.match(reg)); </script> </body> </html>
斷言限制用戶名關鍵詞:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <input type="text" name='user'> <script> //要求註冊名中不能包含cyy let input = document.querySelector('[name=user]'); input.addEventListener('keyup', function () { // let reg = /^(?!.*cyy.*).*/gi; let reg = /^(?!.*cyy.*)[a-z]{5,6}$/gi; console.log(this.value.match(reg)); }) </script> </body> </html>
?<!斷言匹配:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> // ?<! 限制前面不是什麼 let str = 'cyy999ccc'; let reg = /^(?<!\d+)[a-z]+/gi; console.log(str.match(reg)); </script> </body> </html>
使用斷言排除法統一數據:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <main> <a href="https://www.baidu.com/1.jpg">1.jpg</a> <a href="https://oss.baidu.com/2.jpg">2.jpg</a> <a href="https://cdn.baidu.com/3.jpg">3.jpg</a> <a href="https://baidu.com/4.jpg">4.jpg</a> </main> <script> // ?<! 限制前面不是什麼 const main = document.querySelector('main'); //過濾oss let reg = /https:\/\/([a-z]+)?(?<!oss)\..+?(?=\/)/gi; main.innerHTML = main.innerHTML.replace(reg, (v) => { return 'https://oss.baidu.com'; }); </script> </body> </html>