JavaScript高級程序設(shè)計(第3版)學(xué)習(xí)筆記12 js正則表達式
一、正則表達式基礎(chǔ)
1、普通字符:字母、數(shù)字、下劃線、漢字以及所有沒有特殊意義的字符,如ABC123。在匹配時,匹配與之相同的字符。
2、特殊字符:(需要時,使用反斜杠“\”進行轉(zhuǎn)義)
字符 | 含義 | 字符 | 含義 | 字符 | 含義 | 字符 | 含義 |
\a | 響鈴符 = \x07 | ^ | 匹配字符串的開始位置 | \b | 匹配單詞的開始或結(jié)束 | {n} | 匹配n次 |
\f | 換頁符 = \x0C | $ | 匹配字符串的結(jié)束位置 | \B | 匹配不是單詞開始和結(jié)束的位置 | {n,} | 匹配至少n次 |
\n | 換行符 = \x0A | () | 標(biāo)記一個子表達式的開始和結(jié)束 | \d | 匹配數(shù)字 | {n,m} | 匹配n到m次 |
\r | 回車符 = \x0D | [] | 自定義字符組合匹配 | \D | 匹配任意不是數(shù)字的字符 | [0-9] | 匹配0到9中任意一個數(shù)字 |
\t | 制表符 = \x09 | {} | 修飾匹配次數(shù)的符號 | \s | 匹配任意空白字符 | [f-m] | 匹配f到m中任意一個字母 |
\v | 垂直制表符 = \x0B | . | 匹配除換行符外的字符 | \S | 匹配任意非空白字符 | ||
\e | ESC符 = \x1B | ? | 匹配0或1次 | \w | 匹配字母或數(shù)字或下劃線或漢字 | ||
\xXX | 使用兩位十六進制表示形式,可與該編號的字符匹配 | + | 匹配1或多次 | \W | 匹配任意不是字母、數(shù)字、下劃線和漢字的字符 | ||
\uXXXX | 用四位十六進制表示形式,可與該編號的字符匹配 | * | 匹配0或多次 | [^x] | 匹配除x外的所有字符 | ||
\x{XXXXXX} | 使用任意位十六進制表示形式,可與該編號的字符匹配 | | | 左右兩邊表達式之間“或”關(guān)系 | [^aeiou] | 匹配除aeiou外的所有字符 |
上面列舉的這些特殊字符,可以大致的分為:
(1)不便書寫字符:如響鈴符(\a)、換頁符(\f)、換行符(\n)、回車符(\r)、制表符(\t)、ESC符(\e)
(2)十六進制字符:如兩位(\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ù)({})、自定義組合匹配([])、子表達式(())
(6)反義字符:
?。ˋ)通過大小寫反義:如\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)義單個字符
(2)使用“\Q...\E”轉(zhuǎn)義,將表達式中間出現(xiàn)的字符全部作為普通字符
(3)使用“\U...\E”轉(zhuǎn)義,將表達式中間出現(xiàn)的字符全部作為普通字符,并且將小寫字母轉(zhuǎn)換成大寫匹配
(4)使用“\L...\E”轉(zhuǎn)義,將表達式中間出現(xiàn)的字符全部作為普通字符,并且將大寫字母轉(zhuǎn)換為小寫匹配
4、貪婪模式與懶惰模式
如果正則表達式中含有次數(shù)字符時,一般情況下,會盡可能匹配更多的字符,比如用l*n來匹配linjisong的話,會匹配linjison,而不是 lin,這種模式也就是正則表達式的貪婪模式;相對應(yīng)的,可以通過添加字符“?”來設(shè)置為懶惰模式,也即盡可能匹配更少字符。如*?表示重復(fù)0次或多次, 但盡可能少重復(fù)。
5、分組和反向引用
(1)用小括號(())將表達式包含,可以使得表達式作為一個整體來處理,從而達到分組的目的。
(2)默認情況下,每個分組會自動獲取一個組號,按照左括號的順序,從1向后編號。
(3)引擎在處理時,會將小括號內(nèi)部表達式匹配的內(nèi)容保存下來,以方便在匹配過程中或匹配結(jié)束后進一步處理,可以使用反斜杠和組號來引用這個內(nèi)容,如\1表示第一個分組匹配的文本。
(4)也可以自定義組名,語法是(?<name>exp),這個時候反向引用時,還可以使用\k<name>。
(5)也可以不保存匹配內(nèi)容,也不分配組號,語法是(?:exp)。
(6)小括號有一些其他特殊語法,這里列舉幾種,不再深入討論:
分類 | 代碼/語法 | 說明 |
---|---|---|
捕獲 | (exp) | 匹配exp,并捕獲文本到自動命名的組里 |
(?<name>exp) | 匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp) | |
(?:exp) | 匹配exp,不捕獲匹配的文本,也不給此分組分配組號 | |
零寬斷言 | (?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 | |
(?!exp) | 匹配后面跟的不是exp的位置 | |
(?<!exp) | 匹配前面不是exp的位置 | |
注釋 | (?#comment) | 這種類型的分組不對正則表達式的處理產(chǎn)生任何影響,用于提供注釋讓人閱讀 |
到此,對于理解常用的正則表達式已經(jīng)足夠了,若想繼續(xù)學(xué)習(xí)正則表達式的,可以參考正則表達式30分鐘入門教程。下面再熟悉一下Javascript中的正則表達式實現(xiàn)。
二、Javascript中的正則表達式對象RegExp
1、創(chuàng)建正則表達式
(1)使用字面量:語法 var exp = /pattern/flags;
A、pattern是任何正則表達式
B、flags有三種:g表示全局模式、i表示忽略大小寫、m表示多行模式
(2)使用RegExp內(nèi)置構(gòu)造函數(shù):語法 var exp = new RegExp(pattern, flags);
A、使用構(gòu)造函數(shù)時,pattern和flags都是字符串形式,所以對于轉(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使用字面量時會共享一個RegExp實例,使用new RegExp(pattern,flags)會為每個正則表達式創(chuàng)建一個實例;ECMAScript 5規(guī)定每次都創(chuàng)建新實例。
2、實例屬性
(1)global:布爾值,表示是否設(shè)置了g標(biāo)志。
(2)ignoreCase:布爾值,表示是否設(shè)置了i標(biāo)志。
(3)multiline:布爾值,表示是否設(shè)置了m標(biāo)志。
(4)lastIndex:整數(shù),表示開始搜索下一次匹配項的字符位置,從0算起。
(5)source:字符串,表示按照字面量形式創(chuàng)建的字符串模式,即便實例使用構(gòu)造函數(shù)創(chuàng)建,存儲的也是字面量形式的字符串模式。
3、實例方法
(1)exec()方法
A、一個參數(shù),即要應(yīng)用模式的字符串,返回第一個匹配項信息的數(shù)組,沒有匹配時返回null。
B、返回的數(shù)組是Array實例,但還額外有input和index屬性,分別表示應(yīng)用正則表達式的字符串和匹配項在字符串中的位置。
C、匹配時,在返回的數(shù)組中,第1項是與整個模式匹配的字符串,其他項是與模式中的分組匹配的字符串(如果沒有分組,則返回數(shù)組只有1項)。
D、對于exec(),即使設(shè)置了g,每次返回的也是一個匹配項,不同的是,設(shè)置了g,多次調(diào)用exec的開始搜索位置不同,沒有設(shè)置g,每次都從開始搜索。
(2)test()方法
接受一個字符串參數(shù),匹配返回true,不匹配返回false。
三、實例分析
下面看一個出自PhoneGap源碼中用于格式化的正則表達式
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都包含三個分組,第2、3個分組相同,第2個分組(.)匹配任意一個非換行字符,第3個分組(.*)盡可能多(貪婪模式)的匹配任意非換行字符,pattern中的第1個分組(.*?)盡可能少(懶惰模式)的匹配任意非換行字符,而pattern2中的第1個分組(.*)則是盡可能多(貪婪模式)的匹配任意非換行字符了。因此在保證整個模式匹配成功(從而需要保留一個%字符用于匹配正則表達式中的%)的前提下,pattern中第1個分組匹配成了lin,而pattern2中第1個分組匹配成了lin%,分析到這里上例中的輸出也就不難理解了。
- JavaScript中的正則表達式簡明總結(jié)
- javascript中正則表達式反向引用示例介紹
- JavaScript表單通過正則表達式驗證電話號碼
- JavaScript通過正則表達式實現(xiàn)表單驗證電話號碼
- 常用的JavaScript驗證正則表達式匯總
- 正則表達式語法規(guī)則及在Javascript和C#中的使用方法
- javascript正則表達式容易被忽略的小問題整理
- 如何使用Javascript正則表達式來格式化XML內(nèi)容
- 如何使用JavaScript和正則表達式進行數(shù)據(jù)驗證
- javascript中使用正則表達式進行字符串驗證示例
- javascript正則表達式基礎(chǔ)篇
- JavaScript正則表達式驗證中文實例講解
- JavaScript去除空格的三種方法(正則/傳參函數(shù)/trim)
- 經(jīng)典Javascript正則表達式[優(yōu)質(zhì)排版]
- javascript 正則表達式相關(guān)應(yīng)介紹
- 巧解 JavaScript 中的嵌套替換(強大正則)
- javascript中使用正則表達式實現(xiàn)刪除字符串中的前后空格
- javascript正則匹配漢字、數(shù)字、字母、下劃線
相關(guān)文章
JavaScript中的關(guān)鍵字"VAR"使用詳解 分享
JScript的語法教程里面說在聲明變量時忽略var關(guān)鍵字是完全合法的。但是事實常常又證明想當(dāng)然的結(jié)果是不可靠的。2013-07-07JavaScript字符串對象fromCharCode方法入門實例(用于把Unicode值轉(zhuǎn)換為字符串)
這篇文章主要介紹了JavaScript字符串對象fromCharCode 方法入門實例,fromCharCode用于把Unicode值轉(zhuǎn)換為字符串,需要的朋友可以參考下2014-10-10張孝祥JavaScript學(xué)習(xí)階段性總結(jié)(2)--(X)HTML學(xué)習(xí)
張孝祥JavaScript學(xué)習(xí)階段性總結(jié)(2)--(X)HTML學(xué)習(xí)...2007-02-02鍵盤 keycode的值 javascript時觸發(fā)事件時很有用的要素
鍵盤keycode的值 編寫javascript時觸發(fā)事件時很有用的要素,大家可以收藏一下。2009-11-11JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之鏈表
鏈表就是線性表中針對順序存儲結(jié)構(gòu)的一種優(yōu)化手段,但是在javascript語言中由于數(shù)組的特殊性(自動更新引用位置),所以我們可以采用對象的方式做鏈表存儲的結(jié)構(gòu)2016-01-01javascript數(shù)組操作總結(jié)和屬性、方法介紹
這篇文章主要介紹了javascript數(shù)組操作總結(jié),例如數(shù)組的創(chuàng)建、添加、刪除、合并等操作方法,同時總結(jié)了屬性和操作函數(shù)、方法等,需要的朋友可以參考下2014-04-04