一小时学会js正则表达式
生活随笔
收集整理的這篇文章主要介紹了
一小时学会js正则表达式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正則表達式
regular expression : RegExp
用來處理字符串的規則
- 只能處理字符串
- 它是一個規則:可以驗證字符串是否符合某個規則(test),也可以把字符串中符合規則的內容捕獲到(exec/match…)
編寫正則表達式
創建方式有兩種
//=>字面兩創建方式(兩個斜杠之間包起來的,都是用來描述規則的元字符) let reg1 = /\d+/; //=>構造函數模式創建 兩個參數:元字符字符串,修飾符字符串 let reg2 = new RegExp("\\d+");正則表達式由兩部分組成
- 元字符
- 修飾符
元字符詳細解析
^ $
let reg = /^\d/; console.log(reg.test("wenlong")); //false console.log(reg.test("2010wenlong")); //true console.log(reg.test("wenlong2020")); //false let reg = /\d$/; console.log(reg.test("wenlong")); //false console.log(reg.test("2010wenlong")); //false console.log(reg.test("wenlong2020")); //true //=>^/$ 兩個都不加:字符串中包含符合規則的內容即可 let reg1 = /\d+/; //=>^/$ 兩個都加:字符串只能是和規則一致的內容 let reg2 = /^\d+$/;//=> 舉個例子,手機號以1開頭 只能包含11位數字 let reg = /^1\d{10}$/;\
//=>.不是小數點,是除\n外的任意字符 let reg = /^2.3$/; console.log(reg.test("2.3")); //true console.log(reg.test("2@3")); //true console.log(reg.test("23")); //false//=>基于轉義字符,讓其只代表小數點 let reg = /^2\.3$/; console.log(reg.test("2.3")); //true console.log(reg.test("2@3")); //false console.log(reg.test("23")); //false//=>把特殊符號轉為普通的 let str = "\d"; reg = /^\d$/; console.log(reg.test(str)); //falsereg = /^\\d$/; console.log(reg.test("\\d")); //truex|y
//=>---直接x|y會存在很亂的優先級問題,一般我們寫的時候都伴隨小括號進行分組,因為小括號改變處理優先級 let reg = /^18|29$/; console.log(reg.test("18")); //true console.log(reg.test("29")); //true console.log(reg.test("129")); //true console.log(reg.test("189")); //true console.log(reg.test("1829")); //true console.log(reg.test("829")); //true console.log(reg.test("182")); //truelet reg = /^(18|29)$/; //只能是18或者29中的一個[]
//=>1.中括號中出現的字符一般代表本身的含義 let reg = /^[@+]$/; console.log(reg.test("@")); //true console.log(reg.test("+")); //true console.log(reg.test("@@")); //false console.log(reg.test("@+")); //false//=>2. \d在中括號中還是0-9 reg = /^[\d]$/; console.log(reg.test("d")); //false console.log(reg.test("\\")); //false console.log(reg.test("9")); //truereg = /^[\\d]$/; console.log(reg.test("d")); //true console.log(reg.test("\\")); //true console.log(reg.test("9")); //false//=>3. 中括號中不存在多位數 reg=/^[18]$/; console.log(reg.test("1")); //true console.log(reg.test("8")); //true console.log(reg.test("18")); //falsereg=/^[10-29]$/; console.log(reg.test("1")); //true console.log(reg.test("0")); //true console.log(reg.test("2")); //true console.log(reg.test("9")); //true console.log(reg.test("10")); //false常用的表達式
正則兩種創建方式的區別
//=>構造函數傳的是字符串,\需要寫兩個才代表斜杠 let reg =/\d+/g; reg = new RegExp("\\d+","g");//=>正則表達式中的部分內容是變量存儲的值 //1.兩個謝崗中間包起來的都是元字符(如果正則中要包含某個變量的值,則不能使用字面量方式創建) let type = "wenlong"; reg = /^@"+type+"@$/; console.log(reg.test("@wenlong@")); //=>false console.log(reg.test('@""""typeeeeeee"@')); //=>true//2.這種情況只能使用構造函數方式(因為它傳遞的規則是字符串,只有這樣才能進行字符串拼接) reg = new RegExp("^@"+type+"@$"); console.log(reg.test("@wenlong@")); //=>true正則的捕獲
實現正則捕獲的方法
- 正則 RegExp.prototype 上的方法
- exec
- test
- 字符串 String.ptototype 上支持正則表達式處理的方法
- replace
- match
- splite
- …
正則捕獲懶惰性的解決辦法
~ function () {function execAll(str = "") {if (!this.global) return this.exec(str);let ary = [],res = this.exec(str);while (res) {ary.push(res[0]);res = this.exec(str);}return ary.length === 0 ? null : ary;}RegExp.prototype.execAll = execAll; }(); let reg = /\d+/g; let str = "wenlong2019yangfan2020qihang2021"; // 正則添加原型方法 console.log(reg.execAll(str));// 相當于字符串方法 console.log(str.match(reg))正則的分組捕獲
//=>身份證號碼 let str = "130828199012040112"; let reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(?:\d|X)$/; console.log(reg.exec(str)); console.log(str.match(reg)); //=>["130828199012040112", "130828", "1990", "12", "04", "1",, index: 0, input: "130828199012040112"] /* 第一項:大正則匹配的結果 其余項:每一個小分組單獨匹配捕獲的結果 如果設置了分組(改變優先級),但是捕獲的時候不需要單獨捕獲,可以基于?:來處理 */ //=>既要捕獲到{數字},也想單獨的把數字也獲取到,例如:第一次找到{0} 還需要單獨獲取0 let str = "{0}年{1}月{2}日";//=>不設置g匹配一次,exec和match獲取的結果一致(既有大正則匹配的信息,也有小分組匹配的信息) let reg = /\{(\d)+\}/; console.log(reg.exec(str)); console.log(str.match(reg)); //=>["{0}", "0"]//=> let reg = /\{(\d)+\}/g; console.log(reg.exec(str)); console.log(str.match(reg)); //=>["{0}", "{1}", "{2}"] 多次匹配,match只能把大正則匹配的內容獲取到,小分組匹配的信息無法獲取let aryBig = [],arySmall = [],res = reg.exec(str); while(res){let [big,small] = res;aryBig.push(big);arySmall.push(small);res=reg.exec(str); } console.log(aryBig,arySmall); //=>["{0}", "{1}", "{2}"] ["0", "1", "2"] //=>分組引用 let str = "book"; //=>"good"、"look"、"moon"、"foot"... let reg = /^[a-zA-Z]([a-zA-Z])\1[a-zA-Z]$/; //=>分組引用就是通過“\數字“讓其代表和對應數組出現一模一樣的內容 console.log(reg.test("book")); //=>true console.log(reg.test("keep")); //=>true console.log(reg.test("buss")); //=>false console.log(reg.test("some")); //=>false正則捕獲的貪婪性
//=>默認情況下,正則捕獲到的時候,是按照當前正則所匹配的最長結果來獲取的 let str = "珠峰@2019#@2020培訓"; let reg = /\d+/g; console.log(str.match(reg)); //=>["2019","2020"]//=>在量詞元字符后面設置? 取消捕獲時候的貪婪性(按照匹配的最短的結果來獲取) let reg = /\d+?/g; console.log(str.match(reg)); //=>["2", "0", "1", "9", "2", "0", "2", "0"]問號在正則中的五大作用
- 問號左邊是非量詞元字符:本身代表量詞元字符,出現零到一次
- 問號左邊是量詞元字符:取消捕獲時候的貪婪性
- (?: ) 只匹配不捕獲
- (?=) 正向預查
- (?!) 負向預查
()三大作用
- 改變優先級
- 分組捕獲
- 分組引用
其它正則捕獲的方法
案例:把時間字符串進行處理
let time = "2019-08-13"; //=>變為"2019年08月13日" let reg = /^(\d{4})-(\d{1,2})-(\d{1,2})$/;//=>這樣可以實現 time = time.replace(reg,"$1年$2月$3日"); console.log(time); //=>2019年08月13日//=>還可以這樣處理[str].replace([reg],[fuction]) 1.首先拿reg和time進行匹配捕獲,能匹配到幾次就會把傳遞的函數執行幾次(而且是匹配一次就執行一次) 2.不僅把方法執行,而且replace還給方法傳遞了實參信息(和exec捕獲的內容一致的信息:大正則匹配的內容,小分組匹配的信息。。。) 3.在函數中我們返回的是啥,就把當前大正則匹配的內容替換成啥time = time.replace(reg,(big,$1,$2,$3)=>{//=>這里的$1,$2,$3是我們自己設置的變量console.log(big,$1,$2,$3); });time = time.replace(reg,(...arg)=>{let [,$1,$2,$3] = arg;$2.length<2?$2="0"+$2:null;$3.length<3?$3="0"+$3:null;return $1+"年"+$2+"月"+$3+"日"; })單詞首字母大寫
let str = "good good study,day day up!" let reg = /\b([a-zA-z])[a-zA-Z]*\b/g; //=>函數被執行了六次,每一次都把正則匹配信息傳遞給函數 //=>每一次reg:["good","g"] ["good","g"] ["study","s"]...str = str.replace(reg,(...flag)=>{let [big,$1] = flag;console.log(flag,$1); //=> flag大正則匹配的內容,$1自定義小分組匹配的信息$1 = $1.toUpperCase();big = big.substring(1);return $1+big; })找出字符串中出現次數最多的值
//=>數組去重方式實現 let str = "wenlongxiaoxuanzhoulaoshi"; let obj = {}; [].forEach.call(str, char => {if (typeof obj[char] !== "undefined") {obj[char]++;return;}obj[char] = 1; }); let max = 1,res = []; for (let key in obj) {let item = obj[key];item > max ? max = item : null; } for (let key in obj) {let item = obj[key];if (item === max) {res.push(key);} } console.log(`出現次數最多的字符是:${res},出現了${max}次`); //=>排序加正則方式實現 let str = "wenlongxiaoxuanzhoulaoshi"; str = str.split('').sort((a, b) => a.localeCompare(b)).join(''); let ary = str.match(/([a-zA-Z])\1+/g).sort((a, b) => b.length - a.length); console.log(ary); //=>["hhh", "uuu", "ee", "ii", "nn", "oo"zz"] let max = ary[0].length,res = [ary[0].substr(0, 1)]; for (let i = 1; i < ary.length; i++) {let item = ary[i];if (item.length < max) {break;}res.push(item.substr(0, 1)); } console.log(`出現次數最多的字符是:${res},出現了${max}次`);寫到最后
本文章為個人正則學習記錄,純手打,轉載請注明出處。總結
以上是生活随笔為你收集整理的一小时学会js正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 实现验证身份证号真假以及查
- 下一篇: 三字棋代码