正則表達(dá)式

假設(shè)用戶需要在?HTML?表單中填寫姓名赁濒、地址、出生日期等孟害。那么在將表單提交到服務(wù)器進(jìn)一步處理前拒炎,JavaScript?程序會檢查表單以確認(rèn)用戶確實輸入了信息并且這些信息是符合要求的。?


一.?什么是正則表達(dá)式?

正則表達(dá)式( ular?expression)是一個描述字符模式的對象挨务。ECMAScript?的?RegExp?類表示正則表達(dá)式击你,而?String?和?RegExp?都定義了使用正則表達(dá)式進(jìn)行強(qiáng)大的模式匹配和文本檢索與替換的函數(shù)。?

正則表達(dá)式主要用來驗證客戶端的輸入數(shù)據(jù)谎柄。?用戶填寫完表單單擊按鈕之后果漾,?表單就會被發(fā)送到服務(wù)器,在服務(wù)器端通常會用?PHP谷誓、ASP.NET?等服務(wù)器腳本對其進(jìn)行進(jìn)一步處理?绒障。因為客戶端驗證,可以節(jié)約大量的服務(wù)器端的系統(tǒng)資源捍歪,并且提供更好的用戶體驗户辱。?


二.?創(chuàng)建正則表達(dá)式?

創(chuàng)建正則表達(dá)式和創(chuàng)建字符串類似,創(chuàng)建正則表達(dá)式提供了兩種方法糙臼,一種是采用?new運(yùn)算符庐镐,另一個是采用字面量方式。?

1.兩種創(chuàng)建方式?

var?box?=?new?RegExp('box');?//第一個參數(shù)字符串?

var?box?=?new?RegExp('box',?'ig');?//第二個參數(shù)可選模式修飾符?


var?box?=?/box/;?//直接用兩個反斜杠?

var?box?=?/box/ig;?//在第二個斜杠后面加上模式修飾符?



2.測試正則表達(dá)式?

RegExp?對象包含兩個方法:test()和?exec()变逃,功能基本相似必逆,用于測試字符串匹配。test()方法在字符串中查找是否存在指定的正則表達(dá)式并返回布爾值揽乱,如果存在則返回?true名眉,不存在則返回?false。exec()方法也用于在字符串中查找指定正則表達(dá)式凰棉,如果?exec()方法執(zhí)行成功损拢,則返回包含該查找字符串的相關(guān)信息數(shù)組。如果執(zhí)行失敗撒犀,則返回?null福压。?

/*使用?new?運(yùn)算符的?test?方法示例*/?

var?pattern?=?new?RegExp('box',?'i');?//創(chuàng)建正則模式,不區(qū)分大小寫?

var?str?=?'This?is?a?Box!';?//創(chuàng)建要比對的字符串?

alert(pattern.test(str));?//通過?test()方法驗證是否匹配?

/*使用字面量方式的?test?方法示例*/?

var?pattern?=?/box/i;?//創(chuàng)建正則模式或舞,不區(qū)分大小寫?

var?str?=?'This?is?a?Box!';?

alert(pattern.test(str));?

/*使用一條語句實現(xiàn)正則匹配*/?

alert(/box/i.test('This?is?a?Box!'));?//模式和字符串替換掉了兩個變量?

/*使用?exec?返回匹配數(shù)組*/?

var?pattern?=?/box/i;?

var?str?=?'This?is?a?Box!';?

alert(pattern.exec(str));?//匹配了返回數(shù)組荆姆,否則返回?null?

PS:exec?方法還有其他具體應(yīng)用,我們在獲取控制學(xué)完后再看映凳。?


3.使用字符串的正則表達(dá)式方法?

除了?test()和?exec()方法胆筒,String?對象也提供了?4?個使用正則表達(dá)式的方法。?



/*使用?match?方法獲取獲取匹配數(shù)組*/?

var?pattern?=?/box/ig;?//全局搜索?

var?str?=?'This?is?a?Box!魏宽,That?is?a?Box?too';?

alert(str.match(pattern));?//匹配到兩個?Box,Box?

alert(str.match(pattern).length);?//獲取數(shù)組的長度?

/*使用?search?來查找匹配數(shù)據(jù)*/?

var?pattern?=?/box/ig;?

var?str?=?'This?is?a?Box!腐泻,That?is?a?Box?too';?

alert(str.search(pattern));?//查找到返回位置决乎,否則返回-1;?

PS:因為?search?方法查找到即返回队询,也就是說無需?g?全局?

/*使用?replace?替換匹配到的數(shù)據(jù)*/?

var?pattern?=?/box/ig;?

var?str?=?'This?is?a?Box!派桩,That?is?a?Box?too';?

alert(str.replace(pattern,?'Tom'));?//將?Box?替換成了?Tom?

/*使用?split?拆分成字符串?dāng)?shù)組*/?

var?pattern?=?/?/ig;?

var?str?=?'This?is?a?Box!,That?is?a?Box?too';?

alert(str.split(pattern));?//將空格拆開分組成數(shù)組?



??次獒 ? ? ? ? ? ??二狗子?

?RegExp;?

RegExp.input ? ? ? ? ? ? ? ? ? ? ? ?RegExp['$_']?



?/*?使用靜態(tài)屬性/?*/?

var?pattern?=?/(g)oogle/;?

var?str?=?'This?is?google蚌斩!';?

pattern.test(str);?//執(zhí)行一下?

alert(RegExp.input);?//This?is?google铆惑!?

alert(RegExp.leftContext);?//This?is?

alert(RegExp.rightContext);?//!?

alert(RegExp.lastMatch);?//google?

alert(RegExp.lastParen);?//g?

alert(RegExp.multiline);?//false?

PS:Opera?不支持?input送膳、lastMatch员魏、lastParen?和?multiline?屬性。IE?不支持?multiline?屬?

性叠聋。?

所有的屬性可以使用短名來操作?

RegExp.input?可以改寫成?RegExp['$_']撕阎,依次類推。但?RegExp.input?比較特殊碌补,它還可?

以寫成?RegExp.$_虏束。?


/*使用實例屬性*/?

var?pattern?=?/google/ig;?

alert(pattern.global);?//true,是否全局了?

alert(pattern.ignoreCase);?//true厦章,是否忽略大小寫?

alert(pattern.multiline);?//false镇匀,是否支持換行?

alert(pattern.lastIndex);?//0,下次的匹配位置?

alert(pattern.source);?//google袜啃,正則表達(dá)式的源字符串?

var?pattern?=?/google/g;?

var?str?=?'google?google?google';?

pattern.test(str);?//google汗侵,匹配第一次?

alert(pattern.lastIndex);?//6,第二次匹配的位?

PS:?以上基本沒什么用群发。?并且?lastIndex?在獲取下次匹配位置上?IE?和其他瀏覽器有偏差?晰韵,?

主要表現(xiàn)在非全局匹配上。lastIndex?還支持手動設(shè)置熟妓,直接賦值操作宫屠。?


三.?獲取控制?

正則表達(dá)式元字符是包含特殊含義的字符。?它們有一些特殊功能滑蚯,?可以控制匹配模式的?

方式浪蹂。反斜杠后的元字符將失去其特殊含義。?






/*使用點(diǎn)元字符*/?

var?pattern?=?/g..gle/;?//.匹配一個任意字符?

var?str?=?'google';?

alert(pattern.test(str));?


/*重復(fù)匹配*/?

var?pattern?=?/g.*gle/;?//.匹配?0?個一個或多個?

var?str?=?'google';?//*,?,+,{n,m}?

alert(pattern.test(str));?


/*使用字符類匹配*/?

var?pattern?=?/g[a-zA-Z_]*gle/;?//[a-z]*表示任意個?a-z?中的字符?

var?str?=?'google';?

alert(pattern.test(str));?


var?pattern?=?/g[^0-9]*gle/;?//[^0-9]*表示任意個非?0-9?的字符?

var?str?=?'google';?

alert(pattern.test(str));?


var?pattern?=?/[a-z][A-Z]+/;?//[A-Z]+表示?A-Z?一次或多次?

var?str?=?'gOOGLE';?

alert(pattern.test(str));?


/*使用元符號匹配*/?

var?pattern?=?/g\w*gle/;?//\w*匹配任意多個所有字母數(shù)字_?

var?str?=?'google';?

alert(pattern.test(str));?

var?pattern?=?/google\d*/;?//\d*匹配任意多個數(shù)字?

var?str?=?'google444';?

alert(pattern.test(str));?

var?pattern?=?/\D{7,}/;?//\D{7,}匹配至少?7?個非數(shù)字?

var?str?=?'google8';?

alert(pattern.test(str));?

/*使用錨元字符匹配*/?

var?pattern?=?/^google$/;?//^從開頭匹配告材,$從結(jié)尾開始匹配?

var?str?=?'google';?

alert(pattern.test(str));?


var?pattern?=?/goo\sgle/;?//\s?可以匹配到空格?

var?str?=?'goo?gle';?

alert(pattern.test(str));?


var?pattern?=?/google\b/;?//\b?可以匹配是否到了邊界?

var?str?=?'google';?

alert(pattern.test(str));?


/*使用或模式匹配*/?

var?pattern?=?/google|baidu|bing/;?//匹配三種其中一種字符串?

var?str?=?'google';?

alert(pattern.test(str));?


/*使用分組模式匹配*/?

var?pattern?=?/(google){4,8}/;?//匹配分組里的字符串?4-8?次?

var?str?=?'googlegoogle';//只有兩次,所以不行.?

alert(pattern.test(str));?


var?pattern?=?/8(.*)8/;?//獲取?8..8?之間的任意字符?

var?str?=?'This?is?8google8';?

str.match(pattern);?

alert(RegExp.$1);?//得到第一個分組里的字符串內(nèi)容?


var?pattern?=?/8(.*)8/;?

var?str?=?'This?is?8google8';?

var?result?=?str.replace(pattern,'$1');?//得到替換的字符串輸出?

document.write(result);?

var?pattern?=?/(.*)\s(.*)/;?

var?str?=?'google?baidu';?

var?result?=?str.replace(pattern,?'$2?$1');?//將兩個分組的值替換輸出?

document.write(result);?




/*關(guān)于貪婪和惰性*/?

var?pattern?=?/[a-z]+?/;?//?號關(guān)閉了貪婪匹配坤次,只替換了第一個?

var?str?=?'abcdefjhijklmnopqrstuvwxyz';?

var?result?=?str.replace(pattern,?'xxx');?

alert(result);?

var?pattern?=?/8(.+?)8/g;?//禁止了貪婪,開啟的全局?

var?str?=?'This?is?8google8,?That?is?8google8,?There?is?8google8';?

var?result?=?str.replace(pattern,'$1');?

document.write(result);?

var?pattern?=?/8([^8]*)8/g;?//另一種禁止貪婪?

var?str?=?'This?is?8google8,?That?is?8google8,?There?is?8google8';?

var?result?=?str.replace(pattern,'$1');?

document.write(result);?


/*使用?exec?返回數(shù)組*/?

var?pattern?=?/^[a-z]+\s[0-9]{4}$/i;?

var?str?=?'google?2012';?

alert(pattern.exec(str));?//返回整個字符串?

var?pattern?=?/^[a-z]+/i;?//只匹配字母?

var?str?=?'google?2012';?

alert(pattern.exec(str));?//返回?google?

var?pattern?=?/^([a-z]+)\s([0-9]{4})$/i;?//使用分組?

var?str?=?'google?2012';?

alert(pattern.exec(str)[0]);?//google?2012?

alert(pattern.exec(str)[1]);?//google?

alert(pattern.exec(str)[2]);?//2012?


/*捕獲性分組和非捕獲性分組*/?

var?pattern?=?/(\d+)([a-z])/;?//捕獲性分組?

var?str?=?'123abc';?

alert(pattern.exec(str));?

var?pattern?=?/(\d+)(?:[a-z])/;?//非捕獲性分組?

var?str?=?'123abc';?

alert(pattern.exec(str));?


/*使用分組嵌套*/?

var?pattern?=?/(A?(B?(C?)))/;?//從外往內(nèi)獲取?

var?str?=?'ABC';?

alert(pattern.exec(str));?


/*使用前瞻捕獲*/?

var?pattern?=?/(goo(?=gle))/;?//goo?后面必須跟著?gle?才能捕獲?

var?str?=?'google';?

alert(pattern.exec(str));?


/*使用特殊字符匹配*/?

var?pattern?=?/\.\[\/b\]/;?//特殊字符斥赋,用\符號轉(zhuǎn)義即可?

var?str?=?'.[/b]';?

alert(pattern.test(str));?


/*使用換行模式*/?

var?pattern?=?/^\d+/mg;?//啟用了換行模式?

var?str?=?'1.baidu\n2.google\n3.bing';?

var?result?=?str.replace(pattern,?'#');?

alert(result);?


四.?常用的正則?

1.檢查郵政編碼?

var?pattern?=?/[1-9][0-9]{5}/;?//共?6?位數(shù)字缰猴,第一位不能為?0?

var?str?=?'224000';?

alert(pattern.test(str));?

2.檢查文件壓縮包?

var?pattern?=?/[\w]+\.zip|rar|gz/;?//\w?表示所有數(shù)字和字母加下劃線?

var?str?=?'123.zip';?//\.表示匹配.,后面是一個選擇?

alert(pattern.test(str));?

3.刪除多余空格?

var?pattern?=?/\s/g;?//g?必須全局疤剑,才能全部匹配?

var?str?=?'111?222?333';?

var?result?=?str.replace(pattern,'');?//把空格匹配成無空格?

alert(result);?

4.刪除首尾空格?

var?pattern?=?/^\s+/;?//強(qiáng)制首?

var?str?=?'?goo?gle?';?

var?result?=?str.replace(pattern,?'');?

pattern?=?/\s+$/;?//強(qiáng)制尾?

result?=?result.replace(pattern,?'');?

alert('|'?+?result?+?'|');?

var?pattern?=?/^\s*(.+?)\s*$/;?//使用了非貪婪捕獲?

var?str?=?'?google?';?

alert('|'?+?pattern.exec(str)[1]?+?'|');?

var?pattern?=?/^\s*(.+?)\s*$/;?

var?str?=?'?google?';?

alert('|'?+?str.replace(pattern,?'$1')?+?'|');?//使用了分組獲取?

5.簡單的電子郵件驗證?

var?pattern?=?/^([a-zA-Z0-9_\.\-]+)@([a-zA-Z0-9_\.\-]+)\.([a-zA-Z]{2,4})$/;?

var?str?=?'yc60.com@gmail.com';?

alert(pattern.test(str));?

var?pattern?=?/^([\w\.\-]+)@([\w\.\-]+)\.([\w]{2,4})$/;?

var?str?=?'yc60.com@gmail.com';?

alert(pattern.test(str));?

PS:以上是簡單電子郵件驗證滑绒,復(fù)雜的要比這個復(fù)雜很多闷堡,大家可以搜一下。?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疑故,一起剝皮案震驚了整個濱河市杠览,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纵势,老刑警劉巖踱阿,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钦铁,居然都是意外死亡软舌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進(jìn)店門牛曹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佛点,“玉大人,你說我怎么就攤上這事黎比〕” “怎么了?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵焰手,是天一觀的道長糟描。 經(jīng)常有香客問我,道長书妻,這世上最難降的妖魔是什么船响? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮躲履,結(jié)果婚禮上见间,老公的妹妹穿的比我還像新娘。我一直安慰自己工猜,他們只是感情好米诉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著篷帅,像睡著了一般史侣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上魏身,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天惊橱,我揣著相機(jī)與錄音,去河邊找鬼箭昵。 笑死税朴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播正林,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼泡一,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了觅廓?” 一聲冷哼從身側(cè)響起鼻忠,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哪亿,沒想到半個月后粥烁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贤笆,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝇棉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了芥永。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篡殷。...
    茶點(diǎn)故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖埋涧,靈堂內(nèi)的尸體忽然破棺而出板辽,到底是詐尸還是另有隱情,我是刑警寧澤棘催,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布劲弦,位于F島的核電站,受9級特大地震影響醇坝,放射性物質(zhì)發(fā)生泄漏邑跪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一呼猪、第九天 我趴在偏房一處隱蔽的房頂上張望画畅。 院中可真熱鬧,春花似錦宋距、人聲如沸轴踱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淫僻。三九已至,卻和暖如春壶唤,著一層夾襖步出監(jiān)牢的瞬間雳灵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工视粮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留细办,地道東北人。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像笑撞,于是被迫代替她去往敵國和親岛啸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 正則表達(dá)式是一個描述字符模式的對象茴肥,ECMAScript的RegExp類表示正則表達(dá)式坚踩。String與RegExp...
    Miss____Du閱讀 806評論 0 4
  • 什么是正則表達(dá)式?如何創(chuàng)建正則表達(dá)式正則表達(dá)式常用的方法字符串中的正則表達(dá)式常用的正則表達(dá)式假設(shè)用戶需要在HTML...
    greenlift閱讀 812評論 0 0
  • 正則表達(dá)式的元字符是包含特殊含義的字符瓤狐,它們有一些特殊的功能瞬铸,可以控制匹配模式的方式,反斜杠后的元字符失去其特殊含...
    Miss____Du閱讀 1,591評論 0 6
  • RegExp 三大方法本文的RegExp采用直接量語法表示:/pattern/attributes础锐。attribu...
    恩德_b0c2閱讀 464評論 0 0
  • 假如不經(jīng)常寫正則表達(dá)式的話嗓节,真是學(xué)一遍忘一遍。自己再復(fù)習(xí)一遍正則表達(dá)式皆警。另外拦宣,歸納篇會持續(xù)更新文章,但更新的目錄可...
    Maxine708閱讀 367評論 0 0