《JavaScript權(quán)威指南》讀書筆記6 正則表達(dá)式

正則表達(dá)式字符類:

字符 匹配
[...] 方括號(hào)內(nèi)的任意字符
[ ^...] 不在方括號(hào)內(nèi)的任意字符
. 除換行符和其他Unicode行終止符之外的任意字符
\w 任何ASCII字符組成的單詞肴焊,等價(jià)于[a-zA-Z0-9]
\W 任何不是ASCII字符組成的單詞署照,等價(jià)于[^a-zA-Z0-9]
\s 任何Unicode空白符
\S 任何非Unicode空白符的字符镜盯,注意\w和\S不同
\d 任何ASCII數(shù)字,等價(jià)于[0-9]
\D 除了ASCII數(shù)字之外的任何字符揩页,等價(jià)于[^0-9]
[\b] 退格直接量(特例)

正則表達(dá)式重復(fù)字符語法:

字符 含義
{n,m} 匹配前一項(xiàng)至少n次旷偿,但不能超過m次
{n,} 匹配前一項(xiàng)n次或者更多次
{n} 匹配前一項(xiàng)n次
? 匹配前一項(xiàng)0次或者1次,也就是說前一項(xiàng)是可選的爆侣,等價(jià)于{0,1}
+ 匹配前一項(xiàng)1次或多次萍程,等價(jià)于{1,}
* 匹配前一項(xiàng)0次或多次,等價(jià)于{0,}

正則表達(dá)式的選擇兔仰、分組和引用字符:

字符 含義
選擇茫负,匹配的是該符號(hào)左邊的了表達(dá)式或右邊的了表達(dá)式
(...) 組合,將幾個(gè)項(xiàng)組合為一個(gè)單元乎赴,這個(gè)單元可通過『*』忍法、『+』潮尝、『?』和『 』等符號(hào)加以修飾,而且可以記住和這個(gè)組合相匹配的字符串以供此后的引用使用
(?:...) 只組合饿序,把項(xiàng)組合以一個(gè)單元勉失,但不記憶與該組相匹配的字符
\n 和第n個(gè)分組第一次匹配的字符相匹配,組是圓括號(hào)中的子表達(dá)式(也有可能是嵌套的)嗤堰,組索引是從左到右的左括號(hào)數(shù)戴质,『(?:』形式的分組不編碼

正則表達(dá)式中的錨字符:

字符 含義
^ 匹配字符串的開頭度宦,在多行檢索中踢匣,匹配一行的開頭
$ 匹配字符串的結(jié)尾,在多行檢索中戈抄,匹配一行的結(jié)尾
\b 匹配一個(gè)單詞的邊界离唬,簡(jiǎn)言之,就是位于字符\w和\W之間的位置划鸽,或位于字符\w和字符串的開頭或者結(jié)尾之間的位置(但需要注意输莺,[\b]匹配的是退格符)
\B 匹配非單詞邊界的位置
(?=p) 零寬正向先行斷言,要求接下來的字符都與p匹配裸诽,但不能包括匹配p的那些字符
(?!p) 零寬負(fù)向先行斷言嫂用,要求接下來的字符不與p匹配

正則表達(dá)式修飾符:

字符 含義
i 執(zhí)行不區(qū)分大小寫的匹配
g 執(zhí)行一個(gè)全局匹配,簡(jiǎn)言之丈冬,即找到所有的匹配嘱函,而不是在找到第一個(gè)之后就停止
m 多行匹配模式,^匹配一行的開頭和字符串的開頭埂蕊,$匹配行的結(jié)束和字符串的結(jié)束

String.search()

String支持4種使用正則表達(dá)式的方法往弓。最簡(jiǎn)單的是search()。它的參數(shù)是一個(gè)正則表達(dá)式蓄氧,返回第一個(gè)與之匹配的子串的起始位置函似,如果找不到匹配的子串,它將返回-1喉童。比如撇寞,下面的調(diào)用返回值為4:

"JavaScript".search(/script/i);

如果search()的參數(shù)不是正則表達(dá)式,則首先會(huì)通過RegExp構(gòu)造函數(shù)將它轉(zhuǎn)換成正則表達(dá)式堂氯,search()方法不支持全局檢索重抖,因?yàn)樗雎哉齽t表達(dá)式參數(shù)中的修飾符g。

String.replace()

replace()方法用以執(zhí)行檢索與替換操作祖灰。其中第一個(gè)參數(shù)是一個(gè)正則表達(dá)式钟沛,第二個(gè)參數(shù)是要進(jìn)行替換的字符串。這個(gè)方法會(huì)對(duì)調(diào)用它的字符串進(jìn)行檢索局扶,使用指定的模式來匹配恨统。如果正則表達(dá)式中設(shè)置了修飾符g叁扫,那么源字符串中所有與模式匹配的子串都將替換成第二個(gè)參數(shù)指定的字符串;如果不帶修飾符g畜埋,則只替換所匹配的第一個(gè)子串莫绣。如果replace()的第一個(gè)參數(shù)是字符串而不是正則表達(dá)式,則replace()將直接搜索這個(gè)字符串悠鞍,而不是像search()一樣首先通過RegExp()將它轉(zhuǎn)換為正則表達(dá)式对室。

//將所有不區(qū)分大小寫的javascript都替換成大小寫正確的JavaScript
text.replace(/javascript/gi,"JavaScript");

但replace()的功能遠(yuǎn)不止這些】Ъ溃回憶一下前文所提到的掩宜,正則表達(dá)式中使用圓括號(hào)括起來的子表達(dá)式是帶有從左到右的索引編號(hào)的,而且正則表達(dá)式會(huì)記憶與每個(gè)子表達(dá)式匹配的文本么翰。如果在替換字符串中出現(xiàn)了$加數(shù)字颓屑,那么replace()將用與指定的子表達(dá)式相匹配的文本來替換這兩個(gè)字符孽尽。

//一段引用文本起始于引號(hào)谷遂,結(jié)束于引號(hào)
//中間的內(nèi)容區(qū)域不能包含引號(hào)
var quote=/"([^"]*)"/g;

//用中文半角引號(hào)替換英文引號(hào)专普,同時(shí)要保持引號(hào)之間的內(nèi)容(存儲(chǔ)在$1中)沒有被修改
text.replace(quote,'“$1”');

replace()方法的第二個(gè)參數(shù)可以是函數(shù),該函數(shù)能夠動(dòng)態(tài)地計(jì)算替換字符串码耐。

String.match()

match()方法是最常用的String正則表達(dá)式方法追迟。它的唯一參數(shù)就是一個(gè)正則表達(dá)式(或通過RegExp()構(gòu)造函數(shù)將其轉(zhuǎn)換為正則表達(dá)式),返回的是一個(gè)由匹配結(jié)果組成的數(shù)組骚腥。如果該正則表達(dá)式設(shè)置了修飾符g敦间,則該方法返回的數(shù)組包含字符串中的所有匹配結(jié)果。例如:

"1 plus 2 equals 3".match(/\d+/g);  //返回["1","2","3"]

如果這個(gè)正則表達(dá)式?jīng)]有設(shè)置修飾符g桦沉,match()就不會(huì)進(jìn)行全局檢索每瞒,它只檢索第一個(gè)匹配。但即使match()執(zhí)行的不是全局檢索纯露,它也返回一個(gè)數(shù)組剿骨。在這種情況下,數(shù)組的第一個(gè)元素就是匹配的字符串埠褪,余下的元素則是正則表達(dá)式中用圓括號(hào)括起來的子表達(dá)式浓利。因此,如果match()返回一個(gè)數(shù)組a钞速,那么a[0]存放的是完整的匹配贷掖,a[1]存放的則是與第一個(gè)用圓括號(hào)括起來的表達(dá)式相匹配的子串,以此類推渴语。為了和方法replace()保持一致苹威,a[n]存放的是$n的內(nèi)容。

var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
var text = "Visit my blog at http://www.example.com/~david";
var result = text.match(url);
if (result != null) {
    var fullurl = result[0];  //包含"http://www.example.com/~david"
    var protocol = result[1];  //包含"http"
    var host = result[2];  //包含"www.example.com"
    var path = result[3];  //包含"~david"
}

String.split()

String對(duì)象的最后一個(gè)和正則表達(dá)式相關(guān)的方法是split()驾凶。這個(gè)方法用以將調(diào)用它的字符串拆分為一個(gè)子串組成的數(shù)組牙甫,使用的分隔符是split()的參數(shù)掷酗,例如:

"123,456,789".split(",");  //返回["123","456","789"]

split()方法的參數(shù)也可以是一個(gè)正則表達(dá)式,這使得split()方法異常強(qiáng)大窟哺。例如泻轰,可以指定分隔符,允許兩邊可以留有任意多的空白符:

"1,2,3,4,5".split(/\s*,\s*/);  //返回["1","2","3","4","5"]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末且轨,一起剝皮案震驚了整個(gè)濱河市浮声,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旋奢,老刑警劉巖泳挥,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異黄绩,居然都是意外死亡羡洁,警方通過查閱死者的電腦和手機(jī)玷过,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門爽丹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辛蚊,你說我怎么就攤上這事粤蝎。” “怎么了袋马?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵初澎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我虑凛,道長(zhǎng)碑宴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任桑谍,我火速辦了婚禮延柠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锣披。我一直安慰自己贞间,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布雹仿。 她就那樣靜靜地躺著增热,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胧辽。 梳的紋絲不亂的頭發(fā)上峻仇,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音邑商,去河邊找鬼摄咆。 笑死帆调,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的豆同。 我是一名探鬼主播番刊,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼影锈!你這毒婦竟也來了芹务?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鸭廷,失蹤者是張志新(化名)和其女友劉穎枣抱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辆床,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佳晶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讼载。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轿秧。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咨堤,靈堂內(nèi)的尸體忽然破棺而出菇篡,到底是詐尸還是另有隱情,我是刑警寧澤一喘,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布驱还,位于F島的核電站,受9級(jí)特大地震影響凸克,放射性物質(zhì)發(fā)生泄漏议蟆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一萎战、第九天 我趴在偏房一處隱蔽的房頂上張望咐容。 院中可真熱鬧,春花似錦疟丙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孝鹊。三九已至,卻和暖如春苔咪,著一層夾襖步出監(jiān)牢的瞬間团赏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工丝里, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留体谒,地道東北人杯聚。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抒痒,于是被迫代替她去往敵國(guó)和親幌绍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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