相關推薦:
正規表示式(Regular Expression,簡稱regexp)
應用:在專案開發中,手機號碼指定位數的隱藏、資料採集、敏感詞的過濾以及表單的驗證等功能,都可以利用正規表示式來實現。
適用領域:在作業系統(Unix、Linux等)、程式語言(C、C++、Java、PHP、Python、JavaScript等)。
舉例:以文字查詢為例,若在大量的文字中找出符合某個特徵的字串(如手機號碼),就將這個特徵按照正規表示式的語法寫出來,形成一個計算機程式識別的模式(Pattern),然後計算機程式就會根據這個模式到文字中進行匹配,找出符合規則的字串。
正規表示式的發展史
正規表示式的表現形式
在開發中,經常需要根據正則匹配模式完成對指定字串的搜尋和匹配。
String物件中的match()方法除了可在字串內檢索指定的值外,還可以在目標字串中根據正則匹配出所有符合要求的內容,匹配成功後將其儲存到陣列中,匹配失敗則返回false。
在JavaScript應用中,使用正規表示式之前首先需要建立正則物件。除了前面講解過的字面量方式建立外,還可以通過RegExp物件的建構函式的方式建立。
為了讓讀者更好的理解正則物件的獲取,以匹配特殊字元「^」、「$」、「*」、「.」和「\」為例進行對比講解。
注意
建構函式方式與字面量方式建立的正則物件,雖然在功能上完全一致,但它們在語法實現上有一定的區別,前者的pattern在使用時需要對反斜槓(\)進行跳脫。而後者的pattern在編寫時,要放在定界符「/」內,flags標記則放在結尾定界符之外
好處:有效的使用字元類別可以使正規表示式更加簡潔,便於閱讀。
舉例1:大寫字母、小寫字母和數位可以使用「\w」直接表示。
案例2:若要匹配0到9之間的數位可以使用「\d」表示。
下面為了方便讀者理解字元類別的使用,以「.」和「\s」為例進行演示.
字元集合的表示方式:「[]」可以實現一個字元集合。
字元範圍:與連字元「-」一起使用時,表示匹配指定範圍內的字元。
反義字元:元字元「^」與「[]」一起使用時,稱為反義字元。
不在某範圍內: 「^」與「[]」一起使用,表示匹配不在指定字元範圍內的字元。
以字串 ‘get好TB6’.match(/pattern/g) 為例演示其常見的用法。
注意
字元「-」在通常情況下只表示一個普通字元,只有在表示字元範圍時才
作為元字元來使用。「-」連字元表示的範圍遵循字元編碼的順序,如「a-Z」、「z-a」、「a-9」都是不合法的範圍。
【案例】限定輸入內容
程式碼實現思路:
編寫HTML,設定一個年(份)和月(份)的文字方塊,以及一個查詢按鈕。
獲取操作的元素物件,對錶單的提交進行驗證。
驗證年份, 正則:/^\d{4}/ 。 驗 證 月 份 , 正 則 : / ( ( 0 ? [ 1 − 9 ] ) ∣ ( 1 [ 012 ] ) ) /。
文字方塊獲取焦點,去除提示框的顏色。文字方塊失去焦點,去除輸入內容的兩端的空白,並進行驗證。
程式碼實現
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>限定輸入內容</title> <style> input[type=text]{width: 40px;border-color: #bbb;height: 25px;font-size: 14px;border-radius: 2px;outline: 0;border: #ccc 1px solid;padding: 0 10px;-webkit-transition: box-shadow .5s;margin-bottom: 15px;} input[type=text]:hover, input[type=text]:focus,input[type=submit]:hover{border: 1px solid #56b4ef; box-shadow: inset 0 1px 3px rgba(0,0,0,.05),0 0 8px rgba(82,168,236,.6); -webkit-transition: box-shadow .5s;} input::-webkit-input-placeholder {color: #999; -webkit-transition: color .5s;} input:focus::-webkit-input-placeholder, input:hover::-webkit-input-placeholder {color: #c2c2c2; -webkit-transition: color .5s;} input[type=submit]{height: 30px; width: 80px; background: #4393C9; border:1px solid #fff;color: #fff;font:14px bolder; } </style> </head> <body> <form id="form"> 年份 <input type="text" name="year"> 月份 <input type="text" name="month"> <input type="submit" value="查詢"> </form> <p id="result"></p> <script> function checkYear(obj) { if (!obj.value.match(/^\d{4}$/)) { obj.style.borderColor = 'red'; result.innerHTML = '輸入錯誤,年份為4位元數位表示'; return false; } result.innerHTML = ''; return true; } function checkMonth(obj) { if (!obj.value.match(/^((0?[1-9])|(1[012]))$/)) { obj.style.borderColor = 'red'; result.innerHTML = '輸入錯誤,月份為1~12之間'; return false; } result.innerHTML = ''; return true; } var form = document.getElementById('form'); // <form>元素物件 var result = document.getElementById('result'); // <p>元素物件 var inputs = document.getElementsByTagName('input'); // <input>元素集合 form.onsubmit = function() { return checkYear(inputs.year) && checkMonth(inputs.month); }; inputs.year.onfocus = function() { this.style.borderColor = ''; }; inputs.month.onfocus = function() { this.style.borderColor = ''; }; if (!String.prototype.trim) { String.prototype.trim = function() { return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); // \uFEFF位元組順序標記;\xA0不換行空白 }; } inputs.year.onblur = function() { this.value = this.value.trim(); checkYear(this); }; inputs.month.onblur = function() { this.value = this.value.trim(); checkMonth(this); }; </script> </body> </html>
test()方法:檢測正規表示式與指定的字串是否匹配。
匹配成功時,test()方法的返回值為true,否則返回false。
檢測正則物件的模式修飾符
RegExp類中還有一些屬性,用於檢測當前正則物件使用的模式修飾符,以及指定下一次匹配的起始索引等。
下面為了讀者更好的理解這些屬性的使用,以實現空格的匹配為例進行演示。
search()方法:可以返回指定模式的子串在字串首次出現的位置,相對於indexOf()方法來說功能更強大。
split()方法:用於根據指定的分隔符將一個字串分割成字串陣列,其分割後的字串陣列中不包括分隔符。
當分隔符不只一個時,需要定義正則物件才能夠完成字串的分割操作。
注意
當字串為空時,split()方法返回的是一個包含一個空字串的陣列「[「」]」,如果字串和分隔符都是空字串,則返回一個空陣列「[]」。
動手實踐
密碼強度驗證
密碼強度驗證條件:
① 長度<6位,無密碼強度。
②長度>6位,而且包含數位、字母或其他字元中的一種,密碼強度為「低」。
③長度>6位,而且包含數位、字母或其他字元中的二種,密碼強度為「中」。
④長度>6位,而且包含數位、字母或其他字元中的三種及以上,密碼強度為「高」。
提出問題:匹配一個連續出現的字元,如 6個連續出現的數位「458925」。
解決方案1:正則物件/\d\d\d\d\d\d/gi。
存在的問題:重複出現的「\d」既不便於閱讀,書寫又繁瑣。
解決方案2:使用限定符(?、+、*、{ })完成某個字元連續出現的匹配。正則物件/\d{6}/gi。
當點字元(.)和限定符連用時,可以實現匹配指定數量範圍的任意字元。
正則在實現指定數量範圍的任意字元匹配時,支援貪婪匹配和惰性匹配兩種方式。
在正規表示式中,被括號字元「()」括起來的內容,稱之為「子表示式」。
小括號實現了匹配catch和cater,而如果不使用小括號,則變成了catch和er
未分組時,表示匹配2個c字元;而分組後,表示匹配2個「bc」字串。
捕獲:將子表示式匹配到的內容儲存到系統的快取區的過程。
非捕獲:不將子表示式的匹配內容存放到系統的快取中,使用(?:x)實現。
String物件的replace()方法,可直接利用$n(n是大於0的正整數)獲取捕獲內容,完成對子表示式捕獲的內容進行替換的操作。
可以使用」(?:x)」的方式實現非捕獲匹配
在編寫正規表示式時,若要在正規表示式中,獲取存放在快取區內的子表示式的捕獲內容,則可以使用「\n」(n是大於0的正整數)的方式參照,這個過程就是「反向參照」。
零寬斷言:指的是一種零寬度的子表示式匹配,用於查詢子表示式匹配的內容之前或之後是否含有特定的字元集。
分類:分為正向預查和反向預查,但是在JavaScript中僅支援正向預查,即匹配含有或不含有捕獲內容之前的資料,匹配的結果中不含捕獲的內容。
正規表示式中的運運算元有很多。在實際應用時,各種運運算元會遵循優先順序順序進行匹配。正規表示式中常用運運算元優先順序,由高到低的順序如下表。
【案例】內容查詢與替換
程式碼實現思路:
程式碼實現
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>內容查詢與替換</title> <style> p{float:left;} input{margin:0 20px;} </style> </head> <body> <p>過濾前內容:<br> <textarea id="pre" rows="10" cols="40"></textarea> <input id="btn" type="button" value="過濾"> </p> <p>過濾後內容:<br> <textarea id="res" rows="10" cols="40"></textarea> </p> <script> document.getElementById('btn').onclick = function () { // 定義查詢並需要替換的內容規則,[\u4e00-\u9fa5]表示匹配任意中文字元 var reg = /(bad)|[\u4e00-\u9fa5]/gi; var str = document.getElementById('pre').value; var newstr = str.replace(reg, '*'); document.getElementById('res').innerHTML = newstr; }; </script> </body> </html>
相關推薦:
以上就是JavaScript正規表示式,這一篇就夠了的詳細內容,更多請關注TW511.COM其它相關文章!