欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記12 js正則表達(dá)式

 更新時(shí)間:2012年10月11日 16:08:50   作者:  
前面在分析PhoneGap源碼的時(shí)候,曾經(jīng)總結(jié)過一次正則表達(dá)式的用法,為了不同系列文章的完整性,這里將那里的總結(jié)遷移過來
需要指出的是,這里只是總結(jié)了正則表達(dá)式的常用的且比較簡單的語法,而不是全部語法,在我看來,掌握了這些常用語法,已經(jīng)足夠應(yīng)對(duì)日常應(yīng)用了。正則表達(dá)式不只是應(yīng)用在ECMAScript中,在JAVA、.Net、Unix等也有相應(yīng)應(yīng)用,這篇文章則是以ECMAScript中的正則表達(dá)式為基礎(chǔ)總結(jié)的。

一、正則表達(dá)式基礎(chǔ)

1、普通字符:字母、數(shù)字、下劃線、漢字以及所有沒有特殊意義的字符,如ABC123。在匹配時(shí),匹配與之相同的字符。

2、特殊字符:(需要時(shí),使用反斜杠“\”進(jìn)行轉(zhuǎn)義)

字符 含義 字符 含義 字符 含義 字符 含義
\a 響鈴符 = \x07 ^ 匹配字符串的開始位置 \b 匹配單詞的開始或結(jié)束 {n} 匹配n次
\f 換頁符 = \x0C $ 匹配字符串的結(jié)束位置 \B 匹配不是單詞開始和結(jié)束的位置 {n,} 匹配至少n次
\n 換行符 = \x0A () 標(biāo)記一個(gè)子表達(dá)式的開始和結(jié)束 \d 匹配數(shù)字 {n,m} 匹配n到m次
\r 回車符 = \x0D [] 自定義字符組合匹配 \D 匹配任意不是數(shù)字的字符 [0-9] 匹配0到9中任意一個(gè)數(shù)字
\t 制表符 = \x09 {} 修飾匹配次數(shù)的符號(hào) \s 匹配任意空白字符 [f-m] 匹配f到m中任意一個(gè)字母
\v 垂直制表符 = \x0B . 匹配除換行符外的字符 \S 匹配任意非空白字符    
\e ESC符 = \x1B ? 匹配0或1次 \w 匹配字母或數(shù)字或下劃線或漢字    
\xXX 使用兩位十六進(jìn)制表示形式,可與該編號(hào)的字符匹配 + 匹配1或多次 \W 匹配任意不是字母、數(shù)字、下劃線和漢字的字符    
\uXXXX 用四位十六進(jìn)制表示形式,可與該編號(hào)的字符匹配 * 匹配0或多次 [^x] 匹配除x外的所有字符    
\x{XXXXXX} 使用任意位十六進(jìn)制表示形式,可與該編號(hào)的字符匹配 | 左右兩邊表達(dá)式之間“或”關(guān)系 [^aeiou] 匹配除aeiou外的所有字符    

上面列舉的這些特殊字符,可以大致的分為: 

(1)不便書寫字符:如響鈴符(\a)、換頁符(\f)、換行符(\n)、回車符(\r)、制表符(\t)、ESC符(\e)

(2)十六進(jìn)制字符:如兩位(\x02)、四位(\x012B)、任意位(\x{A34D1})

(3)表示位置字符:如字符串開始(^)、字符串結(jié)束($)、單詞開始和結(jié)束(\b)、單詞中間(\B)

(4)表示次數(shù)字符:如0或1次(?)、1或多次(+)、0或多次(*)、n次({n})、至少n次({n,})、n到m次({n,m})

(5)修飾字符:如修飾次數(shù)({})、自定義組合匹配([])、子表達(dá)式(())

(6)反義字符:

  (A)通過大小寫反義:如\b和\B、\d和\D、\s和\S、\w和\W

 ?。˙)通過[^]反義:如[^x]、[^aeiou]

  (C)其它特例:如\n和.也構(gòu)成反義

(7)范圍字符:如數(shù)字范圍([0-9])、字母范圍([f-m])

(8)邏輯字符:如表示或(|)

3、轉(zhuǎn)義

(1)使用反斜杠“\”轉(zhuǎn)義單個(gè)字符

(2)使用“\Q...\E”轉(zhuǎn)義,將表達(dá)式中間出現(xiàn)的字符全部作為普通字符

(3)使用“\U...\E”轉(zhuǎn)義,將表達(dá)式中間出現(xiàn)的字符全部作為普通字符,并且將小寫字母轉(zhuǎn)換成大寫匹配

(4)使用“\L...\E”轉(zhuǎn)義,將表達(dá)式中間出現(xiàn)的字符全部作為普通字符,并且將大寫字母轉(zhuǎn)換為小寫匹配

4、貪婪模式與懶惰模式

   如果正則表達(dá)式中含有次數(shù)字符時(shí),一般情況下,會(huì)盡可能匹配更多的字符,比如用l*n來匹配linjisong的話,會(huì)匹配linjison,而不是 lin,這種模式也就是正則表達(dá)式的貪婪模式;相對(duì)應(yīng)的,可以通過添加字符“?”來設(shè)置為懶惰模式,也即盡可能匹配更少字符。如*?表示重復(fù)0次或多次, 但盡可能少重復(fù)。

5、分組和反向引用

(1)用小括號(hào)(())將表達(dá)式包含,可以使得表達(dá)式作為一個(gè)整體來處理,從而達(dá)到分組的目的。

(2)默認(rèn)情況下,每個(gè)分組會(huì)自動(dòng)獲取一個(gè)組號(hào),按照左括號(hào)的順序,從1向后編號(hào)。

(3)引擎在處理時(shí),會(huì)將小括號(hào)內(nèi)部表達(dá)式匹配的內(nèi)容保存下來,以方便在匹配過程中或匹配結(jié)束后進(jìn)一步處理,可以使用反斜杠和組號(hào)來引用這個(gè)內(nèi)容,如\1表示第一個(gè)分組匹配的文本。

(4)也可以自定義組名,語法是(?<name>exp),這個(gè)時(shí)候反向引用時(shí),還可以使用\k<name>。

(5)也可以不保存匹配內(nèi)容,也不分配組號(hào),語法是(?:exp)。

(6)小括號(hào)有一些其他特殊語法,這里列舉幾種,不再深入討論:

分類 代碼/語法 說明
捕獲 (exp) 匹配exp,并捕獲文本到自動(dòng)命名的組里
(?<name>exp) 匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)
(?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號(hào)
零寬斷言 (?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注釋 (?#comment) 這種類型的分組不對(duì)正則表達(dá)式的處理產(chǎn)生任何影響,用于提供注釋讓人閱讀

到此,對(duì)于理解常用的正則表達(dá)式已經(jīng)足夠了,若想繼續(xù)學(xué)習(xí)正則表達(dá)式的,可以參考正則表達(dá)式30分鐘入門教程。下面再熟悉一下Javascript中的正則表達(dá)式實(shí)現(xiàn)。

二、Javascript中的正則表達(dá)式對(duì)象RegExp

1、創(chuàng)建正則表達(dá)式

(1)使用字面量:語法 var exp = /pattern/flags;

  A、pattern是任何正則表達(dá)式

  B、flags有三種:g表示全局模式、i表示忽略大小寫、m表示多行模式

(2)使用RegExp內(nèi)置構(gòu)造函數(shù):語法 var exp = new RegExp(pattern, flags);

  A、使用構(gòu)造函數(shù)時(shí),pattern和flags都是字符串形式,所以對(duì)于轉(zhuǎn)義字符需要雙重轉(zhuǎn)義,例如:

字面量 構(gòu)造函數(shù)
/\[bc\]at/ "\\[bc\\]at"
/\.at/ "\\.at"
/name\/age/ "name\\/age"
/\d.\d{1,2}/ "\\d.\\d{1,2}"
/\w\\helllo\\123/ "\\w\\\\hello\\\\123"

說明:ECMAScript 3使用字面量時(shí)會(huì)共享一個(gè)RegExp實(shí)例,使用new RegExp(pattern,flags)會(huì)為每個(gè)正則表達(dá)式創(chuàng)建一個(gè)實(shí)例;ECMAScript 5規(guī)定每次都創(chuàng)建新實(shí)例。

2、實(shí)例屬性

(1)global:布爾值,表示是否設(shè)置了g標(biāo)志。

(2)ignoreCase:布爾值,表示是否設(shè)置了i標(biāo)志。

(3)multiline:布爾值,表示是否設(shè)置了m標(biāo)志。

(4)lastIndex:整數(shù),表示開始搜索下一次匹配項(xiàng)的字符位置,從0算起。

(5)source:字符串,表示按照字面量形式創(chuàng)建的字符串模式,即便實(shí)例使用構(gòu)造函數(shù)創(chuàng)建,存儲(chǔ)的也是字面量形式的字符串模式。

3、實(shí)例方法

(1)exec()方法

  A、一個(gè)參數(shù),即要應(yīng)用模式的字符串,返回第一個(gè)匹配項(xiàng)信息的數(shù)組,沒有匹配時(shí)返回null。

  B、返回的數(shù)組是Array實(shí)例,但還額外有input和index屬性,分別表示應(yīng)用正則表達(dá)式的字符串和匹配項(xiàng)在字符串中的位置。

  C、匹配時(shí),在返回的數(shù)組中,第1項(xiàng)是與整個(gè)模式匹配的字符串,其他項(xiàng)是與模式中的分組匹配的字符串(如果沒有分組,則返回?cái)?shù)組只有1項(xiàng))。

  D、對(duì)于exec(),即使設(shè)置了g,每次返回的也是一個(gè)匹配項(xiàng),不同的是,設(shè)置了g,多次調(diào)用exec的開始搜索位置不同,沒有設(shè)置g,每次都從開始搜索。

(2)test()方法

  接受一個(gè)字符串參數(shù),匹配返回true,不匹配返回false。

三、實(shí)例分析

下面看一個(gè)出自PhoneGap源碼中用于格式化的正則表達(dá)式

復(fù)制代碼 代碼如下:

var pattern = /(.*?)%(.)(.*)/;
var str = 'lin%%jisong';
var match = pattern.exec(str);
console.info(match.join(','));//lin%%jisong,lin,%,jisong

var pattern2 = /(.*)%(.)(.*)/;
var match2 = pattern2.exec(str);
console.info(match2.join(','));//lin%%jisong,lin%,j,isong


分析:這里pattern和pattern2都包含三個(gè)分組,第2、3個(gè)分組相同,第2個(gè)分組(.)匹配任意一個(gè)非換行字符,第3個(gè)分組(.*)盡可能多(貪婪模式)的匹配任意非換行字符,pattern中的第1個(gè)分組(.*?)盡可能少(懶惰模式)的匹配任意非換行字符,而pattern2中的第1個(gè)分組(.*)則是盡可能多(貪婪模式)的匹配任意非換行字符了。因此在保證整個(gè)模式匹配成功(從而需要保留一個(gè)%字符用于匹配正則表達(dá)式中的%)的前提下,pattern中第1個(gè)分組匹配成了lin,而pattern2中第1個(gè)分組匹配成了lin%,分析到這里上例中的輸出也就不難理解了。

相關(guān)文章

最新評(píng)論