您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關JavaScript高級正則表達式如何理解,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
正則表達式( Regular Expression )是用于匹配字符串中字符組合的模式。在JavaScript中,正則表達式也是對象。
正則表通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本,例如驗證表單:用戶名表單只能輸入英文字母、數(shù)字或者下劃線, 昵稱輸入框中可以輸入中文(匹配)。此外,正則表達式還常用于過濾掉頁面內容中的一些敏感詞(替換),或從字符串中獲取我們想要的特定部分(提取)等 。
其他語言也會使用正則表達式,本階段我們主要是利用JavaScript 正則表達式完成表單驗證。
靈活性、邏輯性和功能性非常的強。
可以迅速地用極簡單的方式達到字符串的復雜控制。
對于剛接觸的人來說,比較晦澀難懂。比如:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
實際開發(fā),一般都是直接復制寫好的正則表達式. 但是要求會使用正則表達式并且根據(jù)實際情況修改正則表達式. 比如用戶名: /^[a-z0-9_-]{3,16}$/
在 JavaScript 中,可以通過兩種方式創(chuàng)建一個正則表達式。
方式一:通過調用RegExp對象的構造函數(shù)創(chuàng)建
var regexp = new RegExp(/123/);console.log(regexp);
方式二:利用字面量創(chuàng)建 正則表達式
var rg = /123/;
test() 正則對象方法,用于檢測字符串是否符合該規(guī)則,該對象會返回 true 或 false,其參數(shù)是測試字符串。
var rg = /123/; console.log(rg.test(123));//匹配字符中是否出現(xiàn)123 出現(xiàn)結果為true console.log(rg.test('abc'));//匹配字符中是否出現(xiàn)123 未出現(xiàn)結果為false
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gN4RwCa1-1640762098190)(images/img4.png)]
一個正則表達式可以由簡單的字符構成,比如 /abc/,也可以是簡單和特殊字符的組合,比如 /ab*c/ 。其中特殊字符也被稱為元字符,在正則表達式中是具有特殊意義的專用符號,如 ^ 、$ 、+ 等。
邊界符 | 說明 |
---|---|
^ | 表示匹配行首的文本(以誰開始) |
$ | 表示匹配行尾的文本(以誰結束) |
如果 ^和 $ 在一起,表示必須是精確匹配。
var rg = /abc/; // 正則表達式里面不需要加引號 不管是數(shù)字型還是字符串型 // /abc/ 只要包含有abc這個字符串返回的都是true console.log(rg.test('abc')); console.log(rg.test('abcd')); console.log(rg.test('aabcd')); console.log('---------------------------'); var reg = /^abc/; console.log(reg.test('abc')); // true console.log(reg.test('abcd')); // true console.log(reg.test('aabcd')); // false console.log('---------------------------'); var reg1 = /^abc$/; // 精確匹配 要求必須是 abc字符串才符合規(guī)范 console.log(reg1.test('abc')); // true console.log(reg1.test('abcd')); // false console.log(reg1.test('aabcd')); // false console.log(reg1.test('abcabc')); // false
字符類表示有一系列字符可供選擇,只要匹配其中一個就可以了。所有可供選擇的字符都放在方括號內。
3.3.1 [] 方括號
表示有一系列字符可供選擇,只要匹配其中一個就可以了
var rg = /[abc]/; // 只要包含有a 或者 包含有b 或者包含有c 都返回為true console.log(rg.test('andy'));//true console.log(rg.test('baby'));//true console.log(rg.test('color'));//true console.log(rg.test('red'));//false var rg1 = /^[abc]$/; // 三選一 只有是a 或者是 b 或者是c 這三個字母才返回 true console.log(rg1.test('aa'));//false console.log(rg1.test('a'));//true console.log(rg1.test('b'));//true console.log(rg1.test('c'));//true console.log(rg1.test('abc'));//true ---------------------------------------------------------------------------------- var reg = /^[a-z]$/ //26個英文字母任何一個字母返回 true - 表示的是a 到z 的范圍 console.log(reg.test('a'));//true console.log(reg.test('z'));//true console.log(reg.test('A'));//false ----------------------------------------------------------------------------------- //字符組合 var reg1 = /^[a-zA-Z0-9]$/; // 26個英文字母(大寫和小寫都可以)任何一個字母返回 true ------------------------------------------------------------------------------------ //取反 方括號內部加上 ^ 表示取反,只要包含方括號內的字符,都返回 false 。 var reg2 = /^[^a-zA-Z0-9]$/; console.log(reg2.test('a'));//false console.log(reg2.test('B'));//false console.log(reg2.test(8));//false console.log(reg2.test('!'));//true
3.3.2量詞符
量詞符用來設定某個模式出現(xiàn)的次數(shù)。
量詞 | 說明 |
---|---|
* | 重復0次或更多次 |
+ | 重復1次或更多次 |
? | 重復0次或1次 |
{n} | 重復n次 |
{n,} | 重復n次或更多次 |
{n,m} | 重復n到m次 |
3.3.3用戶名表單驗證
功能需求:
1.如果用戶名輸入合法, 則后面提示信息為: 用戶名合法,并且顏色為綠色
2如果用戶名輸入不合法, 則后面提示信息為: 用戶名不符合規(guī)范, 并且顏色為紅色
分析:
用戶名只能為英文字母,數(shù)字,下劃線或者短橫線組成, 并且用戶名長度為6~16位.
首先準備好這種正則表達式模式/$[a-zA-Z0-9-_]{6,16}^/
當表單失去焦點就開始驗證.
如果符合正則規(guī)范, 則讓后面的span標簽添加 right類.
如果不符合正則規(guī)范, 則讓后面的span標簽添加 wrong類.
<input type="text" class="uname"> <span>請輸入用戶名</span> <script> // 量詞是設定某個模式出現(xiàn)的次數(shù) var reg = /^[a-zA-Z0-9_-]{6,16}$/; // 這個模式用戶只能輸入英文字母 數(shù)字 下劃線 中劃線 var uname = document.querySelector('.uname'); var span = document.querySelector('span'); uname.onblur = function() { if (reg.test(this.value)) { console.log('正確的'); span.className = 'right'; span.innerHTML = '用戶名格式輸入正確'; } else { console.log('錯誤的'); span.className = 'wrong'; span.innerHTML = '用戶名格式輸入不正確'; } } </script>
3.3.4 括號總結
1.大括號 量詞符. 里面表示重復次數(shù)
2.中括號 字符集合。匹配方括號中的任意字符.
3.小括號表示優(yōu)先級
預定義類指的是某些常見模式的簡寫方式.
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cETagwqf-1640762098196)(images/img3.png)]
案例:驗證座機號碼
var reg = /^\d{3}-\d{8}|\d{4}-\d{7}$/; var reg = /^\d{3,4}-\d{7,8}$/;
表單驗證案例
//手機號驗證:/^1[3|4|5|7|8][0-9]{9}$/; //驗證通過與不通過更換元素的類名與元素中的內容 if (reg.test(this.value)) { // console.log('正確的'); this.nextElementSibling.className = 'success'; this.nextElementSibling.innerHTML = '<i class="success_icon"></i> 恭喜您輸入正確'; } else { // console.log('不正確'); this.nextElementSibling.className = 'error'; this.nextElementSibling.innerHTML = '<i class="error_icon"></i>格式不正確,請從新輸入 '; }
//QQ號驗證: /^[1-9]\d{4,}$/; //昵稱驗證:/^[\u4e00-\u9fa5]{2,8}$/ //驗證通過與不通過更換元素的類名與元素中的內容 ,將上一步的匹配代碼進行封裝,多次調用即可 function regexp(ele, reg) { ele.onblur = function() { if (reg.test(this.value)) { // console.log('正確的'); this.nextElementSibling.className = 'success'; this.nextElementSibling.innerHTML = '<i class="success_icon"></i> 恭喜您輸入正確'; } else { // console.log('不正確'); this.nextElementSibling.className = 'error'; this.nextElementSibling.innerHTML = '<i class="error_icon"></i> 格式不正確,請從新輸入 '; } } };
//密碼驗證:/^[a-zA-Z0-9_-]{6,16}$/
//再次輸入密碼只需匹配與上次輸入的密碼值 是否一致
replace() 方法可以實現(xiàn)替換字符串操作,用來替換的參數(shù)可以是一個字符串或是一個正則表達式。
var str = 'andy和red'; var newStr = str.replace('andy', 'baby'); console.log(newStr)//baby和red //等同于 此處的andy可以寫在正則表達式內 var newStr2 = str.replace(/andy/, 'baby'); console.log(newStr2)//baby和red //全部替換 var str = 'abcabc' var nStr = str.replace(/a/,'哈哈') console.log(nStr) //哈哈bcabc //全部替換g var nStr = str.replace(/a/a,'哈哈') console.log(nStr) //哈哈bc哈哈bc //忽略大小寫i var str = 'aAbcAba'; var newStr = str.replace(/a/gi,'哈哈')//"哈哈哈哈bc哈哈b哈哈"
案例:過濾敏感詞匯
<textarea name="" id="message"></textarea> <button>提交</button> <div></div> <script> var text = document.querySelector('textarea'); var btn = document.querySelector('button'); var div = document.querySelector('div'); btn.onclick = function() { div.innerHTML = text.value.replace(/激情|gay/g, '**'); } </script>
原本的事件流中,是先捕獲再冒泡。
對于目標元素來說,如果DOM節(jié)點通過addEventListener同時綁定了兩個事件監(jiān)聽函數(shù),一個用于捕獲,一個用于冒泡,那么兩個事件的執(zhí)行順序是按照代碼添加的順序執(zhí)行的。所以,先綁定冒泡的函數(shù),再綁定捕獲的函數(shù),即可實現(xiàn)。
對于非目標元素來說,可以給捕獲事件的處理程序添加一個定時器,將處理程序推入下一個宏任務執(zhí)行。
事件委托是指 不在子節(jié)點單獨設置事件監(jiān)聽器,而將事件監(jiān)聽器設置在父節(jié)點上,再利用冒泡原理使每一個子節(jié)點都能觸發(fā)該事件。
事件委托的優(yōu)點:只操作一次Dom,提高了程序的性能。
常用于:ul和li標簽的事件監(jiān)聽,一般采用事件委托機制將事件監(jiān)聽器綁定在ul上。
還適合動態(tài)元素的綁定,新添加的子元素不需單獨添加事件處理程序。
事件代理/事件委托:利用了事件冒泡,只指定一個事件處理程序,就可以管理某一類型的事件,簡而言之:事件代理就是說我們將事件添加到本來要添加的事件的父節(jié)點,將事件委托給父節(jié)點來觸發(fā)處理函數(shù),這通常會使用在大量的同級元素需要添加同一類事件的時候,比如一個動態(tài)的非常多的列表,需要為每個列表項都添加點擊事件,這時就可以使用事件代理,通過判斷e.target.nodeName來判斷發(fā)生的具體元素,這樣做的好處是減少事件綁定,同事動態(tài)的DOM結構任然可以監(jiān)聽,事件代理發(fā)生在冒泡階段
事件委托是利用冒泡階段的運行機制來實現(xiàn)的,就是把一個元素響應事件的函數(shù)委托到另一個元素,一般是把一組元素的事件委托到他的父元素上。
委托的優(yōu)點是減少內存消耗,節(jié)約效率動態(tài)綁定事件
事件冒泡,就是元素自身的事件被觸發(fā)后,如果父元素有相同的事件,如onclick事件,那么元素本身的觸發(fā)狀態(tài)就會傳遞,也就是冒到父元素,父元素的相同事件也會一級一級根據(jù)嵌套關系向外觸發(fā),直到document/window,冒泡過程結束。
可以在父元素層面阻止事件向子元素傳播,也可代替子元素執(zhí)行某些操作。
關于JavaScript高級正則表達式如何理解就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。