正則表達式是處理字符串的一門藝術手法,應用場景常常出如今表單驗證部分;
JavaScript高級程序設計一書開篇提到,JavaScript這門語言最原始的應用就是處理輸入驗證操做,因此正則表達式從JavaScript誕生那一刻就與其結下不解之緣;javascript
正則表達式(Regular Expression)能夠理解爲規則表達式,即以表達式的形式定義一項規則,而後根據這一規則去檢索字符串,最後根據匹配結果進行後續的處理操做(判斷、獲取或是替換等);
正則表達式根據建立形式的不一樣,可分爲字面量和構造函數RegExp對象;
1.1 字面量方法
正則表達式的字面量方法由正則模式(pattern)和修飾符(flags)構成;html
var regExp = /pattern/flags;
1.2 RegExp構造函數
能夠經過RegExp這一構造函數去建立一個正則表達式對象;java
var regExp = new RegExp('pattern','flags')
須要注意的兩者不一樣在於:字面量採用/pattern/
,而正則對象採用"pattern"
字符串;因此出現轉義字符時,構造函數建立的正則對象的參數須要進行轉義;正則表達式
var regExp = /\hello\/; var regExp1 = new RegExp('\\hello\\');
1.3 flags規則
模式的規則將會在下文單獨開一章講解,先講述flags
規則;
正則表達式能夠添加3個修飾符從而起到改變檢索規則的做用;數組
g:表示全局模式,檢索全部字符串,而不是發現第一個匹配項時中止檢索;
i:表示忽略大小寫模式;函數
m:表示多行模式,進行多行的檢索;spa
模式的規則是正則表達式的核心部分,模式可有普通字符(打印字符和非打印字符)和特殊字符構成;.net
2.1 普通字符
普通字符由全部數字、中外文字母、標點符號和非打印字符構成;
非打印字符包括:設計
\cx:control-x \n:換行符; \r:回車符; \t:製表符; \v:垂直製表符; \f:換頁符; \s:空白字符,等價於[\f\n\r\t\v]
2.2 特殊字符
所謂特殊字符,就是具備特殊含義的字符,包括:限定符、定位符、類型符、分組符、條件符、非獲取匹配符等code
限定符
限定符限定一個正則表達式出現次數;
*:匹配前面子表達式任意次,等價於{0,}; +:匹配前面子表達式1次以上,等價於{1,}; ?:匹配前面子表達式0次或1次,等價於{0,1}; {n}:匹配子表達式n次; {n,}:匹配子表達式n次以上; {n,m}:匹配子表達式n~m次之間,默認是貪婪模式取m次,當在該限定符後面添加?開啓非貪婪模式;這個?可應用於全部限定符後;
定位符
定位符可以高效匹配到字符出現位置;
^:匹配字符串開始的位置,注意在[]中表示取反匹配; $:匹配字符串結尾的位置; \b:匹配字符邊界;
類型符
類型符是小羊本身爲了記憶方便定義的,就是能夠匹配不一樣的數據類型;
.:匹配除換行符的任意字符; \w:匹配任何單詞字符,等價於[a-zA-z0-9]; \d:匹配數字;
分組符
():將表達式放入圓括號成爲子表達式;
條件符
|:分支條件,匹配位於|兩側的字表達,至關於或;
非獲取匹配符
非獲取匹配符指的是匹配表達式但不獲取匹配結果;
(?:pattern):匹配 pattern 但不獲取匹配結果; (?=pattern):正向預查,在任何匹配 pattern 的字符串開始處匹配查找字符串; (?!pattern):負向預查,在任何不匹配 pattern 的字符串開始處匹配查找字符串
取反操做
下面這幾個都是對應先前特殊字符的取反操做;
\D \W \B \S [^pattern]
反向引用
對一個正則表達式模式或部分模式兩邊添加圓括號將致使相關匹配存儲到一個臨時緩衝區中,所捕獲的每一個子匹配都按照在正則表達式模式中從左到右出現的順序存儲。緩衝區編號從 1 開始,最多可存儲 99 個捕獲的子表達式;
Is is the cost of of gasoline going up up? /\b([a-z]+) \1\b/gi 匹配Is is和up up
3.1 字符串的方法
match:接受正則表達式,返回匹配結果;
replace:接受兩個參數,第一個爲正則,第二個爲替換值(也能夠是一個函數),返回新字符串,不改變原字符串;
3.2 正則實例的屬性和方法
正則實例的屬性
正則實例的屬性主要包括ignoreCase、global、multiline返回是否設置修飾符的布爾值,lastIndex返回下一次開始搜索的位置,source返回正則表達式的字符串形式;
正則實例的屬性
test:傳入一個字符串,返回布爾值表示匹配結果的判斷;帶有修飾符g時,每一次test方法都從上一次結束的位置開始向後匹配;
exec:傳入一個字符串,返回匹配結果的數組;
下面根據目前經常使用的表單驗證時用到的正則,給出幾個檢索的案例;解;
3.1 手機號碼檢索
function isPhoneNum(str){ //020-80723000 //07518869865 //13832132341 var regExp = /^0\d{2}[-]?\d{8}|^0\d{3}[-]?\d{7}|^1\d{10}/ return regExp.test(str); };
3.2 E-mail檢索
function isEmail(str){ var regExp = /^[a-zA-Z]\w*@[0-9a-zA-Z]+\.[a-zA-Z]+/; return regExp.test(str) };
3.3 密碼檢索
function isValidPassword(str){ //長度6-20個字符,包括大寫字母、小寫字母、數字、下劃線至少兩種 if(/\W*/.test(str)){ return false }else if(/\w{0,5}|\w{21,}/.test(str)){ return false; }else if(/^\d+$|^[a-zA-Z]$|^_+$/.test(str)){ return false }else{ return true; } }
3.4 用戶名的檢索
function isValidUsername(str){ //長度爲6-20個字符,只能包括字母數字和下劃線 var regExp = /^\w{6,20}$/ return regExp.test(str); };
3. 5 Url檢索
https://www.baidu.com:8080/index.html#q=hello https:// ([a-zA-Z]*:\/\/)? www.baidu.com \S+ :8080 (:\d*)? / \/ index.html \S* #q=hello (#.*)?
經過本文,咱們能夠了解到:
正則表達式能夠理解爲根據規定的規則,去檢索字符串而後根據匹配結果進行後續的處理,處理能夠包括判斷、獲取和替換;
正則表達式的建立方法能夠使用字面量和構造函數形式;兩種方法都是由正則模式和修飾符構成,不一樣之處在於構造函數須要以字符串形式傳參;
修飾符規則部分能夠傳遞三個參數,分別爲g
、i
和m
,能夠起到改變檢索規則的做用;
模式規則做爲正則表達式,由普通字符和特殊字符構成;
普通字符包括打印字符和非打印字符;
特殊字符即那些具備特殊含義的字符,主要包括限定符
、定位符
、類型符
、分組符
、分組符
、條件符
、非獲取匹配符
等;
正則表達式以實例形式出現時,擁有本身的屬性和方法,而且字符串的一些方法與正則表達式也存在密切的關係;
字符串的方法包括:match
和replace
方法;
正則實例的屬性和方法包括:ignonreCase
、global
、multiline
、test
和exec
等;
最後給出了幾個正則表達式的應用實例,包括手機號碼、密碼、用戶名、E-mail和URL檢索
;
《JavaScript高級程序設計(第3版)》