国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
JavaScript對象與繼承教程之內(nèi)置對象(下)
JavaScript對象與繼承教程之內(nèi)置對象(下) 收藏 此文于2011-01-30被推薦到CSDN首頁
如何被推薦?
5、 RegExp類
現(xiàn)在要介紹的內(nèi)容不完全與RegExp類有關(guān),他幾乎包含了正則表達(dá)式的大部分的基本知識點(diǎn)和含義,但是我無意擴(kuò)展出來說,如果對此感興趣,推薦些教程和好書。以下推薦絕非隨機(jī)、隨意。
《精通正則表達(dá)式》,該書的作者和譯者都對正則表達(dá)式有十分深厚的功底和理解,同時該書也是我目前為止見到的最好的教材,而且不用擔(dān)心你的英文不好,該書的中文版翻譯質(zhì)量絕對一流。不過,這本書正如書名一樣,是給對正則有興趣,且真心的希望有所精通的人看的。
blog.csdn.net/lxcnn。該博客絕對是當(dāng)今中國數(shù)一數(shù)二的關(guān)于正則方面的精品,博主的造詣絕不含糊,且文筆和內(nèi)容也十分值得大家一看的。
《正則表達(dá)式傻瓜書》,該書的作者即《精通》一書的譯者,有幸翻閱了該書的樣章,書中的內(nèi)容深淺合宜,語言精煉,加之作者深厚的功底,書的質(zhì)量不言而喻。雖然該書尚未出版,但是絕對的值得期待。
《正則表達(dá)式必知必會》,該書短小易懂,適合不大希望精通于此,僅限于能用即可的朋友閱讀,該書中有許多實(shí)例,很多內(nèi)容大家甚至可以拿來就用,只是受制于其篇幅,該書不大適合進(jìn)階閱讀。
如果你對以上的珍品不感興趣,那么下面的內(nèi)容希望你能耐心的看下去,我會盡我所能來讓你有所收獲。
正則表達(dá)式通常用于查找、驗證、替換字符串內(nèi)容。其便捷和高效致使它漸漸的為大家所接收和喜愛,我想很多看到這里的朋友可能會有這樣的感受:“每次用到的時候我都會翻一遍正則的簡明教程或手冊,但是總是記不住,而且當(dāng)有一天翻自己所寫的正則時,會看不懂。”。那么沒關(guān)系,記不住是因為你沒有深入的去了解和思考它,我不會窮舉每一個元字符和語法結(jié)構(gòu),盡量讓它變得有那么一點(diǎn)意思。
案例一、驗證一個字符串由8到16位數(shù)字、英文字母、下劃線組成。
這個驗證是最基本且最常用的,驗證的首要條件是限制死首和尾,即正則必須匹配整個字符串,從起始字符一直到結(jié)尾字符。先看正則
/ ^ [ \d a-zA-Z_] {8,16} $ /
這個正則中沒有任何的空白,兩個/之間的內(nèi)容就是正則表達(dá)式,在JavaScript中我們有兩個方式創(chuàng)建正則表達(dá)式對象,上面的是字面量對象,另外一個是構(gòu)造函數(shù)方法,即
view plaincopy to clipboardprint?
var reg = new RegExp("^[\\da-zA-Z_]{8,16}$","mode"); 
var reg = new RegExp("^[\\da-zA-Z_]{8,16}$","mode");

關(guān)于模式,有g(shù)、i、m三個,i表示忽略大小寫,g和m會在后面深入解析,因為簡單的說個一兩句不會太容易理解。
兩者效果幾乎等效,而字面量方式簡潔的許多,細(xì)心的你一定看到后一種方法中\(zhòng)d前多了一個\。原因是字符串中\(zhòng)x會被當(dāng)作轉(zhuǎn)義字符進(jìn)行轉(zhuǎn)義。
接下來看藍(lán)色部分,^和$符號分別代表字符串的開始和字符串的結(jié)尾,但是在m模式的時候他們的含義會有不同,在m模式下,他們分別代表行首和行尾。
[]之間的是字符集合,這相當(dāng)于字符的switch,[^...]則是匹配非集合。這個很好理解,在你看過的任何一篇教程中都不會漏下它,不過你一定想知道匹配不等于某個字符串的字符串該怎么辦,答案是否定環(huán)視(斷言、預(yù)查,以下統(tǒng)一稱為環(huán)視),一會在介紹環(huán)視時,我們再來介紹。
{8,16}表示一個范圍量詞,他表示匹配之前的分組或字符重復(fù)多少次。與之相對應(yīng)的還有+,*,?,{m,},{,n}等。
案例二、驗證一個有數(shù)字、字母組成的8-12位字符串。必須包含至少一個數(shù)字和字母。
這個與案例一有點(diǎn)區(qū)別,那就是最后一句的限制,所以我們需要引入一個判斷邏輯,那就是環(huán)視,先引入環(huán)視的概念和解釋吧^_^。
環(huán)視從方向來說分為逆序和順序,從邏輯來說分為肯定和否定。不過JavaScript正則表達(dá)式不支持逆序的環(huán)視,只支持順序肯定環(huán)視、順序否定環(huán)視。環(huán)視有個特點(diǎn)就是不占據(jù)所匹配字符,所以他會預(yù)先進(jìn)行一次匹配,然后匹配完了之后會回溯會環(huán)視匹配之前的位置。讓我們看剛才的案例吧。首先進(jìn)行2次否定環(huán)視,分別排除掉純粹由數(shù)字或由字母組成的字符串。然后再把案例一的正則表達(dá)式放進(jìn)來就可以了。如下
/^(?!\d+$)(?!\D+$)[a-zA-Z\d]{8,12}$/
假設(shè)字符串為abcdefg123。那么匹配的過程如下。首先^匹配字符串開始,接著是第一個否定環(huán)視,(?!\d+$)他從'a'開始匹配,\d+即不能匹配,匹配失敗,否定環(huán)視成功,接下來匹配(?!\D+$),\D表示非數(shù)字,那么從a-g都可以匹配,接下來是1,\D+匹配完成,如果沒有$那么這個匹配其實(shí)也算成功,但是\D+匹配完成之后有一個$,那么$匹配1失敗。否定環(huán)視成功,此時字符串位置回到a之前。開始后面的匹配。[a-zA-Z\d]{8,12}匹配abcdefg123成功,具體過程忽略,然后把句柄交給$,匹配成功。此時整個匹配成功。因為篇幅和表述能力問題,關(guān)于環(huán)視的解釋不夠清晰,如果至此你依然沒有弄清。那么請訪問過客的相關(guān)博客,真的很棒( blog.csdn.net/lxcnn )。
好吧,我們現(xiàn)在倒回來看一些日常應(yīng)用中的一些誤解導(dǎo)致的錯誤應(yīng)用。
1、 包含字母數(shù)字的字符串判斷使用\w是不對的。因為\w<==>[a-zA-Z0-9_],所以使用時請注意
2、 JavaScript中不支持逆序環(huán)視。無論是肯定還是否定,因此如果其他語言的程序員在使用js正則的時候千萬要注意
3、 .元字符在字符組中是普通字符,而不解釋為任意字符的元字符,同時.元字符不匹配\n(換行符),JavaScript中沒有單行模式以使.匹配\n。
4、 在使用test、exec時一定要弄清楚g模式之后再使用。因為一旦使用了g模式,那么會保存全局的lastIndex,在你下一次進(jìn)行匹配時是從lastIndex開始,而非字符串首。(感謝過客之前對此的解釋和指導(dǎo)。有興趣的可以看這個帖子,看過客的解釋 http://topic.csdn.net/u/20110117/18/e2423564-856b-4f46-8879-0c382a3e1c7a.html?93335 )。在這里我把其中的例子發(fā)出來,讓大家有個了解,請看:
view plaincopy to clipboardprint?
var   arr   =   [ 1 , 2 , 3 , 4 , 5 ];  
var   reg   =   /^\d+$/g ;  
for ( var   i   =   0 ;   i   <   arr . length ; i ++){  
    alert ( reg . test ( arr [ i ]));  
}  
var   arr   =   [ 1 , 2 , 3 , 4 , 5 ];
var   reg   =   /^\d+$/g ;
for ( var   i   =   0 ;   i   <   arr . length ; i ++){
    alert ( reg . test ( arr [ i ]));
5、 js正則不支持命名分組,所以后向引用的時候要格外注意分組的序號。
6、 js正則不支持固話分組和占有優(yōu)先量詞。所以如果可以的話,[^xx]+取代.+?來使用,一方面可以提高效率,另一方面可以減少錯誤的匹配結(jié)果。
7、 正則效率上,new RegExp()與字面量方式創(chuàng)建沒有區(qū)別,而使用變量保存一個正則對象和循環(huán)中使用同一個正則表達(dá)式字面量效率上也沒區(qū)別(至少在大部分的瀏覽器上是這樣的)。
8、 在使用new RegExp()創(chuàng)建正則的時候,切記轉(zhuǎn)義問題。new RegExp("\\d")才等價于/\d/,使用new RegExp("\d")就會得到錯誤的正則。
9、 回溯和環(huán)視是2個非常重要的概念,同時也要弄清楚位置和字符的區(qū)別。時間和能力的原因,推薦移步過客的博客( http://blog.csdn.net/lxcnn/archive/2009/06/28/4304754.aspxhttp://blog.csdn.net/lxcnn/archive/2009/06/28/4304651.aspx
關(guān)于正則目前僅僅只提這些,因為后面準(zhǔn)備了一個實(shí)戰(zhàn)博客,那個時候會詳細(xì)介紹幾個實(shí)用的實(shí)例以及推導(dǎo)過程。下面看看在介紹字符串的時候落下的幾個方法。replace/match/search,OK,我們來一個一個看吧
replace方法是提供強(qiáng)大的替換功能,他不僅能夠替換簡單的文本。還能使用一個替換函數(shù)來進(jìn)行更復(fù)雜的替換,請看下面的代碼:
view plaincopy to clipboardprint?
var   str   =   "dream on, dream on, dream on,dream yourself a dream come true.dream on, dream on, dream on," ;  
var   reg   =   /dream/g ;  
var   i   =   0 ;  
alert ( str . replace ( reg , function ( m ){  
    return   m   +   ( i ++). toString ();  
}));  
var   str   =   "dream on, dream on, dream on,dream yourself a dream come true.dream on, dream on, dream on," ;
var   reg   =   /dream/g ;
var   i   =   0 ;
alert ( str . replace ( reg , function ( m ){
    return   m   +   ( i ++). toString ();
})); 
 
該方法通過一個匿名方法,將查找到的dream單詞進(jìn)行替換,該替換會給后面的dream單詞添加一個序列。你可能會想到下面的方法:
view plaincopy to clipboardprint?
var   str   =   "dream on, dream on, dream on,dream yourself a dream come true.dream on, dream on, dream on," ;  
var   reg   =   /(dream)/g ;  
var   i   =   0 ;  
alert ( str . replace ( reg , "$1"   +   i ++));  
var   str   =   "dream on, dream on, dream on,dream yourself a dream come true.dream on, dream on, dream on," ;
var   reg   =   /(dream)/g ;
var   i   =   0 ;
alert ( str . replace ( reg , "$1"   +   i ++)); 
可惜很遺憾你運(yùn)行一下就會發(fā)現(xiàn)每次都是0。這點(diǎn)在任何可以使用委托方法(匿名方法、函數(shù)指針==)進(jìn)行替換的語言中都是一樣的,這個和替換機(jī)制是有關(guān)的。
replace的時候非正則替換有個缺陷,就是只會替換第一個。相當(dāng)于沒有加上g模式的正則。所以使用的時候一定要注意,當(dāng)然在替換的時候不要忘了g模式喲。
match則是查找匹配的方法,他同樣支持正則表達(dá)式作為查找模式,不過有一點(diǎn)需要注意,如果使用全局檢索(g模式)的時候,返回的是一個數(shù)組,該數(shù)組不包括分組信息。而如果不使用全局檢索(g模式)的時候,返回的是第一個匹配的文本,以及各分組的匹配內(nèi)容。比如下面的代碼:
view plaincopy to clipboardprint?
var   str   =   "dream on, dream on, dream on,dream yourself a dream come true.dream on, dream on, dream on," ;  
var   reg   =   /(dream)[^,]+/ ;  
alert ( str . match ( reg )); //返回數(shù)組,數(shù)組內(nèi)容為 dream on,dream2 個元素。  
reg   =   /(dream)[^,]+/g ;  
alert ( str . match ( reg )); //返回數(shù)組,數(shù)組內(nèi)容為 dream on,dream on,dream on,dream yourself a dream come true.dream on, dream on,dream on 幾個元素。  
var   str   =   "dream on, dream on, dream on,dream yourself a dream come true.dream on, dream on, dream on," ;
var   reg   =   /(dream)[^,]+/ ;
alert ( str . match ( reg )); //返回數(shù)組,數(shù)組內(nèi)容為 dream on,dream2 個元素。
reg   =   /(dream)[^,]+/g ;
alert ( str . match ( reg )); //返回數(shù)組,數(shù)組內(nèi)容為 dream on,dream on,dream on,dream yourself a dream come true.dream on, dream on,dream on 幾個元素。 
最后一個是search,他接收一個正則對象,他返回search到的第一個匹配文本的起始位置,該方法不受g模式的影響。
view plaincopy to clipboardprint?
var   str   =   "dream on, dream on, dream on,dream yourself a dream come true.dream on, dream on, dream on," ;  
reg   =   /dream/g ;  
alert ( str . search ( reg ));  
alert ( str . search ( reg ));  
alert ( str . search ( reg ));  
var   str   =   "dream on, dream on, dream on,dream yourself a dream come true.dream on, dream on, dream on," ;
reg   =   /dream/g ;
alert ( str . search ( reg ));
alert ( str . search ( reg ));
alert ( str . search ( reg )); 
該方法三次alert出的都是0。其實(shí)還有一個split方法也支持正則。不過它很簡單,在這里不再提了。
RegExp有以下的屬性需要記住,lastIndex是最后一次匹配的位置(還記得g模式么),source是正則表達(dá)式的源文本,而$1、$+、$$等意味著什么請可查看下手冊,這里就不一一列舉了。
6、 Global對象
這里沒有用類這個名詞,是因為連這個關(guān)鍵字實(shí)際上都不存在,在JavaScript中所有的函數(shù)都是對象的方法,所以你看到的所有內(nèi)置的“函數(shù)”其實(shí)都是全局對象的方法。
編碼、解碼方法,對uri進(jìn)行編碼是為了使防亂碼的一個有效措施,很多后臺語言也都有相對應(yīng)的解碼、編碼方法。 encodeURI/encodeURIComponent/decodeURI/decodeURIComponent。
如果不能區(qū)分其中的區(qū)別,那么用后者代替前者吧。
escape/unescape基本上不推薦使用,用上面的方法來取代吧。
類型轉(zhuǎn)換的方法也是比較常用的方法。比如Number、String方法,但是看似簡單的2個方法還有真點(diǎn)需要補(bǔ)充的。Number方法不能取代parseInt和parseFloat方法,因為Number方法只能把真正的數(shù)字轉(zhuǎn)換為數(shù)字(該方法用來驗證一個輸入是否是數(shù)字很好吧)。先看這4句代碼。
view plaincopy to clipboardprint?
alert ( Number ( '01x' )); //NaN  
alert ( Number ( '011' )); //11  
alert ( String ( 0X11 )); //17  
alert ( String ( 011 )); //9  
alert ( Number ( '01x' )); //NaN
alert ( Number ( '011' )); //11
alert ( String ( 0X11 )); //17
alert ( String ( 011 )); //9 
其實(shí)關(guān)于這點(diǎn)我在之前的博客提到過,現(xiàn)在再拿出來解釋下。第一個如果用parseInt會得到1,而用Number強(qiáng)轉(zhuǎn)將返回NaN。千萬要使用isNaN來判斷是否成功轉(zhuǎn)換,而不是Number('01x').constructor == Number。因為NaN是個數(shù)字類型,但是他的意思是Not a Number。第二個返回的是11,看上去很正常???可是011往往可能意味著是8進(jìn)制的數(shù)哦。所以字符串形式的011和數(shù)字型的011可不是一個意思哦。所以在使用數(shù)字字面量的時候注意前置0的使用。第三行返回的是17,為什么?剛才提到過0X11是16進(jìn)制的數(shù)字,那么他翻譯為17就意味著轉(zhuǎn)換為string類型前會強(qiáng)轉(zhuǎn)為10進(jìn)制數(shù),第三行同理。那么第三行想輸出11怎么辦呢,使用它:(0x11).toString('16'),8進(jìn)制也一樣哦。所以轉(zhuǎn)換的時候要了解清楚先。
最后一個要說的是最有爭議的eval方法。他的功能十分強(qiáng)大,但是缺點(diǎn)也異常明顯,代碼不易讀、性能低下、安全性降低。所以一般情況下可以用setTimeout、setInterval、數(shù)組等方法來替代。注意在處理json的時候要把json包括在一個括號里哦:eval('(' + jsondata + ')');

本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/cj205/archive/2011/01/24/6161968.aspx
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
JavaScript 正則表達(dá)exec與match的區(qū)別說明
JavaScript中正則表達(dá)式test()、exec()、match() 方法區(qū)別
V3.5RegExp對象用法.htm
js中替換一個字符串中的某一段字符串
javascript正則表達(dá)式
精通 JavaScript中的正則表達(dá)式 - JavaScript
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服