RegExp物件的語意和使用:
檢查字串比對取得字串中的部分內容在原始字串的基礎上建立一個新的字串(包括新增、刪除和修改)
建構一個RegExp物件主要有兩種方法:
使用literal,如/w/g
使用建構函數,如new RegExp(/w/)
建構RegExp物件有以下幾個注意點:
literal常用來建構非runtime產生的靜態的RegExp物件
literal之後可以直接加入flag用來對匹配字串的執行結果進行限制,常用flag包含g和i,分別用來表示全域匹配(global)和忽略大小寫匹配(case-insensitive)
RegExp建構子的第一個參數提供該物件的pattern,如果pattern是一個RegExp literal,那麼就不能提供第二個參數(即指定flag)。如果pattern是一個string,那麼可以使用第二個參數
RegExp建構子常用於建構runtime產生的動態RegExp對象
RegExp的pattern為string時所有literal中的””都必須寫成”\”,因為””在string中需要被轉義以上兩種方法構建的都一個javascript對象,因此/w/ == /w/傳回false
RegExp物件相關的功能:
要檢查字串的匹配,可以使用regExp.test(string) 方法,該方法檢查string是否符合regExp提供的pattern。也可以使用string.search(regExp)方法,如果兩者不匹配將會回傳-1
要取得字串中的部分內容,可以使用regExp.exec(string) 方法,也可以使用string.match(regExp)方法要在原有字串上建構一個新的字串,通常使用string.replace(searchValue, replaceValue)方法
RegExp物件中提供pattern的語義:
RegExp可以定義多個Alternative用”|”分割,該運算的優先級最低,因此如果存在”|”,那麼它首先把RegExp分割成幾大部分每個Alternative由多個term組成,term分為assertion(用於位置限定),atom(匹配的單元),帶有Quantifier(修飾符)的atom
assertion分為”^”用於匹配字串開頭,在multiInput(即flag包含m時),也可以匹配一行的開頭,”$”用於匹配字符串結尾,在multiInput(即flag包含m時),也可以匹配一行的結尾,”b”用於匹配一個w和W間隔,注意它並不匹配任何字符串中的內容,而只是用來判斷一個位置的匹配情況
atom的情況比較複雜,我們先來看atom的Quantifier,可以包含* + ? {n} {m,} {m,n},其中*表示atom可以有0次或以上的重複,+表示1次或以上的重複,?表示0或1次,{n}表示恰巧n次重複,{m,}表示m或以上的重複,{m,n}表示重複次數在m和n之間(包含m和n ),在以上的Quantifier之後還可以跟一個?用來啟動non-greedy模式,我將在後文中說明這個模式的意義。
atom包含patternCharacter(普通字符,即在pattern中沒有特殊語義的字符,匹配時將按照字面進行匹配)
“.” 匹配所有非line-terminator字符
AtomEscape 包含數字型1(用於引用先前的括號中的符合成功的內容)。一些字元的引用n f r t v xNN uXXXX cX等。一些特殊意義的字符,如d D s S w W
CharacterClass,包含[...]和[^...]兩種形式。其中可以包含許多字符,如-、 n等字符引用、b、d等特殊含義字符。注意如果”-”左右有字符,那麼語義變為從某一字符到某一字符。如果”-”左或右沒有字符,那麼”-”僅表示dash字符。
(group),以上模式進行group就可以在group之後使用Quantifier修飾
(?:group),僅作為group使用,而不會記錄group匹配的內容從而不算在1..n中
(?=group),要求符合但不會在傳回的符合string中包含group符合的內容
(?!group),要求不符且不會在返回的匹配string中包含group匹配的內容下面我要講一下RegExp的兩個比較重要的運作模式:
匹配Alternative總是從左到右,如果遇到第一個匹配的就不再嘗試之後的匹配,如
/ab|abc/.exec("abc")以上字符串”abc”僅匹配pattern中的ab,而不會去匹配abc
匹配時總是一般不在Quantifier後面加?的都使用greedy模式,添加?後使用non-greedy模式,如
/w+bc/.exec("abcbcbc")匹配時w+總是先盡可能多的匹配(即greedy模式),因此它會匹配”abcbcbc”,如果改為
/w+?bc/.exec("abcbcbc")那麼他會盡可能少的匹配(即non-greedy模式),因此僅匹配”abc”。
對於一般的解析字串的要求,一般可以使用exec或match方法解析,如果字串很大那麼往往需要使用循環結構進行解析,配合while等語句,RegExp是很強大的。
對於要將現有的一個字串透過修改轉變為另一個字串時,一般總是使用replace方法,這個方法是我覺得RegExp中最重要的方法,它的多態性使他具有多種形式,幾乎能夠滿足所有修改字串的需求。