JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記12 js正則表達(dá)式
一、正則表達(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á)式
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%,分析到這里上例中的輸出也就不難理解了。
- JavaScript中的正則表達(dá)式簡明總結(jié)
- javascript中正則表達(dá)式反向引用示例介紹
- JavaScript表單通過正則表達(dá)式驗(yàn)證電話號(hào)碼
- JavaScript通過正則表達(dá)式實(shí)現(xiàn)表單驗(yàn)證電話號(hào)碼
- 常用的JavaScript驗(yàn)證正則表達(dá)式匯總
- 正則表達(dá)式語法規(guī)則及在Javascript和C#中的使用方法
- javascript正則表達(dá)式容易被忽略的小問題整理
- 如何使用Javascript正則表達(dá)式來格式化XML內(nèi)容
- 如何使用JavaScript和正則表達(dá)式進(jìn)行數(shù)據(jù)驗(yàn)證
- javascript中使用正則表達(dá)式進(jìn)行字符串驗(yàn)證示例
- javascript正則表達(dá)式基礎(chǔ)篇
- JavaScript正則表達(dá)式驗(yàn)證中文實(shí)例講解
- JavaScript去除空格的三種方法(正則/傳參函數(shù)/trim)
- 經(jīng)典Javascript正則表達(dá)式[優(yōu)質(zhì)排版]
- javascript 正則表達(dá)式相關(guān)應(yīng)介紹
- 巧解 JavaScript 中的嵌套替換(強(qiáng)大正則)
- javascript中使用正則表達(dá)式實(shí)現(xiàn)刪除字符串中的前后空格
- javascript正則匹配漢字、數(shù)字、字母、下劃線
相關(guān)文章
JavaScript中的關(guān)鍵字"VAR"使用詳解 分享
JScript的語法教程里面說在聲明變量時(shí)忽略var關(guān)鍵字是完全合法的。但是事實(shí)常常又證明想當(dāng)然的結(jié)果是不可靠的。2013-07-07JavaScript字符串對(duì)象fromCharCode方法入門實(shí)例(用于把Unicode值轉(zhuǎn)換為字符串)
這篇文章主要介紹了JavaScript字符串對(duì)象fromCharCode 方法入門實(shí)例,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時(shí)觸發(fā)事件時(shí)很有用的要素
鍵盤keycode的值 編寫javascript時(shí)觸發(fā)事件時(shí)很有用的要素,大家可以收藏一下。2009-11-11JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之鏈表
鏈表就是線性表中針對(duì)順序存儲(chǔ)結(jié)構(gòu)的一種優(yōu)化手段,但是在javascript語言中由于數(shù)組的特殊性(自動(dòng)更新引用位置),所以我們可以采用對(duì)象的方式做鏈表存儲(chǔ)的結(jié)構(gòu)2016-01-01javascript數(shù)組操作總結(jié)和屬性、方法介紹
這篇文章主要介紹了javascript數(shù)組操作總結(jié),例如數(shù)組的創(chuàng)建、添加、刪除、合并等操作方法,同時(shí)總結(jié)了屬性和操作函數(shù)、方法等,需要的朋友可以參考下2014-04-04