?? 正則表達(dá)式
?.正則表達(dá)式及其作用
?.RegExp對象
?.String對象中與正則表達(dá)式有關(guān)的方法
?.正則表達(dá)式的語法參考
?.實(shí)用程序舉例
?什么是正則表達(dá)式?
?.文件路徑通配符
?"?"通配符匹配文件名中的單個字符,而"'"通配符匹配零個或多個字符。data?.dat就是一中文
?本模式,它能匹配data1.dat,data2.dat,datax.dat,dataN.dat等文件名。data*.dat是另一種文
?本模式,它匹配data.dat,data1.dat,data2.dat,data12.dat,datax.dat等文件名。
?
?.正則表達(dá)式
?是由英文詞語regular expression翻譯過來的,英文比中文更能實(shí)現(xiàn)其含義,就是符合某種規(guī)則
?的表達(dá)式。可以將正則表達(dá)式理解為一種對文件進(jìn)行模糊匹配的語言,它用一些特殊的符號(稱
?為元字符)來代表某種特征(例如,全都是數(shù)字)的一組字符以及指定匹配的次數(shù),含有元字符
?的文本不再表示某一具體的文本內(nèi)容,而是形成了一種文本模式,它可以匹配符合這種模式的所
?有文本串。
?
?元字符與子匹配
?.元字符
?如果一個圖書的編號格式是:要么是5個數(shù)字字符,例如,10101;要么是5個數(shù)字后加上一個連字號
?(-),再加上4個數(shù)字組成的10個字符,例如,11111-1234。那么,要在一個大的文本串中查找這
?兩種格式的圖書編號時,就可以用\d{5}(-\d{4})?做為匹配模式。
?如果要讓abc?中的bc同時受到?的作用,必須使用圓括號將他們括起來,使它們成為一個緊密結(jié)合
?的組合項,這樣后面的?就表示圓括號中的內(nèi)容可有可無,例如,a(bc)?能匹配a和abc。
?.字匹配
?圓口號所括起來的部分為一個子匹配(也叫子表達(dá)式),除了可以得到整個正則表達(dá)式的匹配
?結(jié)果外,還可以單獨(dú)得到每個子表達(dá)式部分所匹配的結(jié)果。
?多個子表達(dá)式所匹配的原始內(nèi)容按照它們正則表達(dá)式模式中從左到右出現(xiàn)的順序存儲在緩沖區(qū)中
?,這種過程稱為捕獲。圓括號中的子匹配所捕獲的內(nèi)容可在整個表達(dá)式中位于這個括號之后的
?地方被反引用,第一括號(即第一個子匹配)捕獲的內(nèi)容用\1表示,第二個圓括號(即第二個子
?匹配)捕獲的內(nèi)容\2表示,依次類推。例如,要匹配2個相同的連續(xù)字符的正則表達(dá)式為(\d)\1.
?要匹配連續(xù)5個相同的數(shù)字字符的正則表達(dá)式為(\d)\1{4}.要匹配1221.3553.6776等數(shù)字。可以
?使用正則表達(dá)式為(\d)(\d)\2\1。
? 正則表達(dá)式的作用
?.測試字符串是否匹配某個模式,從而實(shí)現(xiàn)數(shù)據(jù)格式的有效性驗證。
?.將一段文本中滿足某一正則表達(dá)式模式的文本內(nèi)容替換為別的內(nèi)容或刪除(即替換為空字符串)
? 例如,將一大段文本中的所有的19xx年的內(nèi)容替換為20xx年,其中xx部分是兩個任意的數(shù)字,
? 不會被替換,但不能簡單地用20替換19,否則1919就被替換為2020。
?.在一段文本中搜索具有某一類型特征的文本內(nèi)容。精確搜索和正則表達(dá)式的模式搜索最大的區(qū)
? 別就是:精確搜索是搜索一個具體的文本,而模式搜索是模式搜索具有某一類型特征的文本。
?
? RegExp對象
?JavaScript中提供了一個名為RegExp的對象來完成有關(guān)正則表達(dá)式的操作和功能,每一條正則
?表達(dá)式模式對應(yīng)一個RegExp對象實(shí)例。
?創(chuàng)建RegExp對象實(shí)例
?(1)使用RegExp對象的顯示構(gòu)造函數(shù),語法為:new RegExp("pattern"[,"flags"]);
?(2)使用RegExp對象的隱式構(gòu)造函數(shù),采用純粹的文本格式:/pattern/[flags]
?
?flags標(biāo)志字符:
???? -g 用做全局標(biāo)志
???? -i 用做忽略大小寫標(biāo)志
???? -m 用做多行標(biāo)志
???? 如果沒有設(shè)置這個標(biāo)志,那么元字符"^"只與整個被搜索字符串的開始位置相匹配,而元字符
???? "$"只與整個被搜索字符串的結(jié)束位置相匹配。如果設(shè)置了這個標(biāo)志,那么"^"還可以與被
???? 搜索字符串中的"\n"或"\r"之后的位置相匹配。
? 注意:
? 當(dāng)使用構(gòu)造函數(shù)的方式創(chuàng)建RegExp實(shí)例對象的時候,應(yīng)將原始的正則表達(dá)式模式文本中的每個
? "\"都使用"\\"來替換,例如,下面的語句等價:
?? var re=new RegExp("\\d{5}");
?? var re=^d{5}/
?RegExp對象-屬性
?.所有RegExp對象實(shí)例共享靜態(tài)屬性
?.單個對象實(shí)例的屬性
?靜態(tài)屬性:
?.index
?.input
?.lastIndex
?.lastMatch
?.lastParen
?.lastContext
?.leftContext
?.rightContext
?.$1...$9
?對象實(shí)例屬性:
?.global
?.ignoreCase
?.multiline
?.source
?RegExp對象-方法
?.test方法
?語法格式為:test(str)。檢查一個字符串中是否存在創(chuàng)建RegExp對象實(shí)例所指定的正則表達(dá)式模式
?.exec方法
?語法格式為:exec(str)。使用創(chuàng)建RegExp對象實(shí)例時所指定的正則表達(dá)式模式對一個字符串執(zhí)行
?搜索,并返回一個包含搜索結(jié)果的數(shù)組。
?.compile方法
?語法格式為:compile("pattern"[,"flags"])。更換RegExp對象實(shí)例所使用的正則表達(dá)式模式,并
?將新的正則表達(dá)式模式編譯為內(nèi)部格式,從而使以后的匹配過程執(zhí)行更快。
?RegExp對象-綜合舉例
?code:
<script language="javascript">
??? var strSrc="xxa1b01c001yya2b02c002zz";
??? var re="/a(\d)b(\d{2})c(\d{3})/gi";
??? var arr,count=0;
??? while((arr = re.exec(strSrc))!=null)
??? {
?????? displayResult();
??? }
??? function displayResult()
??? {
????? document.write(<p>這是用正則表達(dá)式/"+re.source+"/gi對字符串<br>\""
???????????????? +RegExp.input+ "\"進(jìn)行第" +(++count)+ "次搜索的結(jié)果:<br>");
????? document.write("RegExp.index為"+RegExp.index+"<br>");
????? document.write("RegExp.lastindex為"+RegExp.lastindex+"<br>");
????? document.write("RegExp.lastMatch為"+RegExp.lastMatch+"<br>");
????? document.write("RegExp.lastParen為"+RegExp.lastParen+"<br>");
????? document.write("RegExp.lastContext為"+RegExp.lastContext+"<br>");
????? document.write("RegExp.$1為"+RegExp.$1+"<br>");
????? document.write("RegExp.$1為"+RegExp.$2+"<br>");
????? document.write("RegExp.$1為"+RegExp.$3+"<br>");
????? document.write("RegExp.$1為"+RegExp.$4+"<br>");
????? document.write("arr.index為"+arr.index+"<br>");
????? document.write("arr.input為"+arr.input+"<br>");
????? document.write("arr.lastindex為"+arr.lastindex+"<br>");
????? document.write("返回的元素個數(shù)為"+arr.length+"<br>");
????? document.write("返回數(shù)組的類容為[");
????? for(var i=0;i<arr.length;i++)
????? {
???????? if(arr.length-1)
??????????? document.write("\""+arr[i]+"\",");
???????? else
??????????? document.write("\""+arr[i]+"\"]</p>");
????? }
?????
??? }
?</script>
?
?String對象中與正則表達(dá)式有關(guān)的方法
?.match方法
?語法格式為:match(Exp)。與RegExp對象的exec方法類似,它使用正則表達(dá)式模式對字符串執(zhí)行
?搜索,并返回一個包含搜索結(jié)果的數(shù)組。
?<script language="javascript">
?? var strSrc="xxa1b01c001yya2b02c002zz";
?? var re=/a(\d)b(\d(2))c(\d{3})/gi;
?? var arr;
?? arr=strSrc.match(re);
?? for(var i=0;i<arr.length;i++)
?? {
????? if(i<arr.length-1)
???????? document.write("[\""+arr[i]+"\",");
????? else
???????? document.write("\""+arr[i]+"\"]");
?? }
?</script>
?
?.search方法
?語法格式為:serach(rgExp)。返回使用正則表達(dá)式搜索時,第一個匹配的字符串在整個被搜索
?的字符串中的位置。
?.replace方法
?語法格式為: replace(rgExp,replaceText)。使用正則表達(dá)式模式對字符串執(zhí)行搜索,并對搜索
?到的內(nèi)容用指定的字符串替換,返回值包含替換后的內(nèi)容的字符串對象。