JS技巧:Javascript正則表達(dá)式基礎(chǔ)
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
RegExp對象的語義和使用: 檢查字符串匹配 獲取字符串中的部分內(nèi)容 在原字符串的基礎(chǔ)上構(gòu)建一個(gè)新的字符串(包括添加、刪除和修改) 構(gòu)建一個(gè)RegExp對象主要有兩種方法: 使用literal,如/\w/g 使用構(gòu)造函數(shù),如 new RegExp(/\w/) 構(gòu)建RegExp對象有以下幾個(gè)注意點(diǎn): literal常用來構(gòu)建非runtime產(chǎn)生的靜態(tài)的RegExp對象 literal之后可以直接添加flag用來對匹配字符串的執(zhí)行結(jié)果進(jìn)行限制,常用flag包括g和i,分別用來表示全局匹配(global)和忽略大小寫匹配(case-insensitive) RegExp構(gòu)造函數(shù)的第一個(gè)參數(shù)提供該對象的pattern,如果pattern是一個(gè)RegExp literal,那么就不能提供第二個(gè)參數(shù)(即指定flag)。如果pattern是一個(gè)string,那么可以使用第二個(gè)參數(shù) RegExp構(gòu)造函數(shù)常用于構(gòu)建runtime產(chǎn)生的動(dòng)態(tài)RegExp對象 RegExp的pattern為string時(shí)所有l(wèi)iteral中的”\”都必須寫成”\\”,因?yàn)椤盶”在string中需要被轉(zhuǎn)義 以上兩種方法構(gòu)建的都一個(gè)javascript對象,因此/\w/ == /\w/返回false RegExp對象相關(guān)的功能: 要檢查字符串的匹配,可以使用 regExp.test(string) 方法,該方法檢查string是否匹配regExp提供的pattern。還可以使用 string.search(regExp)方法,如果兩者不匹配將會(huì)返回-1 要獲取字符串中的部分內(nèi)容,可以使用 regExp.exec(string) 方法,也可以使用string.match(regExp)方法 要在原有字符串上構(gòu)建一個(gè)新的字符串,通常使用string.replace(searchValue, replaceValue)方法 RegExp對象中提供pattern的語義: RegExp可以定義多個(gè)Alternative用”|”分割,該運(yùn)算的優(yōu)先級最低,因此如果存在”|”,那么它首先把RegExp分割成幾大部分 每個(gè)Alternative由多個(gè)term組成,term分為assertion(用于位置限定),atom(匹配的單元),帶Quantifier(修飾符)的atom assertion分為”^”用于匹配字符串開頭,在multiInput(即flag包含m時(shí)),也可以匹配一行的開頭,”$”用于匹配字符串結(jié)尾,在multiInput(即flag包含m時(shí)),也可以匹配一行的結(jié)尾,”\b”用于匹配一個(gè)\w和\W間隔,注意它并不匹配任何字符串中的內(nèi)容,而只是用來判斷一個(gè)位置的匹配情況 atom的情況比較復(fù)雜,我們首先來看atom的Quantifier,可以包含* + ? {n} {m,} {m,n},其中*表示atom可以有0次或以上的重復(fù),+表示1次或以上的重復(fù),?表示0或1次,{n}表示恰巧n次重復(fù),{m,}表示m或以上的重復(fù),{m,n}表示重復(fù)次數(shù)在m和n之間(包含m和n),在以上的Quantifier之后還可以跟一個(gè)?用來啟動(dòng)non-greedy模式,我將在后文中說明這種模式的意義。 atom包含patternCharacter(普通字符,即在pattern中沒有特殊語義的字符,匹配時(shí)將按照字面進(jìn)行匹配) “.” 匹配所有非line-terminator字符 \AtomEscape 包含數(shù)字型 \1(用于引用之前的括號中的匹配成功的內(nèi)容)。一些字符的引用\n \f \r \t \v \xNN \uXXXX \cX等。一些特殊含義的字符,如\d \D \s \S \w \W CharacterClass,包含[...]和[^...]兩種形式。其中可以包含很多字符,如-、 \n等字符引用、\b、\d等特殊含義字符。注意如果”-”左右有字符,那么語義變?yōu)閺哪骋蛔址侥骋蛔址?。如果?”左或者右沒有字符,那么”-”僅表示dash字符。 (group),以上模式進(jìn)行g(shù)roup就可以在group之后使用Quantifier修飾 (?:group),僅作為group使用,而不會(huì)記錄group匹配的內(nèi)容從而不算在\1..\n中 (?=group),要求匹配但不會(huì)在返回的匹配string中包含group匹配的內(nèi)容 (?!group),要求不匹配且不會(huì)在返回的匹配string中包含group匹配的內(nèi)容 下面我要講一下RegExp的兩個(gè)比較重要的運(yùn)作模式: 匹配Alternative總是從左到右,如果遇到第一個(gè)匹配的就不再嘗試之后的匹配,如 /ab|abc/.exec("abc") 以上字符串”abc”僅匹配pattern中的ab,而不會(huì)去匹配abc 匹配時(shí)總是一般不在Quantifier后添加?的都使用greedy模式,添加?后使用non-greedy模式,如 /\w+bc/.exec("abcbcbc") 匹配時(shí)\w+總是先盡可能多的匹配(即greedy模式),因此它會(huì)匹配”abcbcbc”,如果改為 /\w+?bc/.exec("abcbcbc") 那么他會(huì)盡可能少的匹配(即non-greedy模式),因此僅匹配”abc”。 對于一般的解析字符串的要求,一般可以使用exec或match方法解析,如果字符串很大那么往往需要使用循環(huán)結(jié)構(gòu)進(jìn)行解析,配合while等語句,RegExp是很強(qiáng)大的。 對于要將現(xiàn)有的一個(gè)字符串通過修改轉(zhuǎn)變?yōu)榱硪粋€(gè)字符串時(shí),一般總是使用replace方法,這個(gè)方法是我覺得RegExp中最重要的方法,它的多態(tài)性使他具有多種形式,幾乎能夠滿足所有修改字符串的需求。
該文章在 2010/8/17 23:30:28 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |