String的部分方法,在Regex中執行模式比對、檢索和替換操作。String支援四種利用Regex的方法:
① search( ):
該方法以Regex為參數,返回第一個與之匹配的子串的開始字元的位置,如果沒有任何匹配的子串,它將返回-1。例如下面的調用返回4:
"JavaScript".search(/script/i); //4
如果search( )的參數不是Regex,它首先將被傳遞給RegExp建構函式,轉換成Regex。search( )不支援全域檢索,因為它忽略了Regex參數的標誌g。
② replace( ):
該方法執行檢索與替換操作。它的第一個參數是一個Regex,第二個參數是要進行替換的字串。它將檢索調用它的字串,根據指定的模式來匹配。如果Regex中設定了標誌g,該方法將用替換字串替換被檢索的字串中所有與模式比對的子串,否則它只替換所發現的第一個與模式比對的子串。如果replace( )的第一個參數是字串,而不是Regex,該方法將直接檢索那個字串,而不是像search(
)那樣用RegExp( )建構函式將它轉換成一個Regex。例如,我們可以用如下方法使用replace( )將文本字串中的所有javascript(不區分大小寫)統一為“JavaScript”:
<script> var text="javascript and JAVAscript and c++"; alert(text.replace(/javascript/gi,"JavaScript")); </script>
但是replace( )的功能遠比上例所示強大。最值得注意的是,replace( )方法的第二個參數可以是函數,該函數能夠動態地計算替換字串。replace( )還有其他重要特性,這裡不一一贅述。
③ match( ):
match( )方法是String最常用的Regex方法。它唯一的參數就是一個Regex(或把它的參數傳遞給建構函式RegExp( )以轉換成Regex),返回的是包含了匹配結果的數組。如果該Regex設定了標誌g,該方法返回的數組包含的就是出現在字串中的所有匹配。例如:
<script> alert("1 plus 2 equals 3".match(/\d+/g)); //1,2,3</script>
如果該Regex沒有設定標誌g,match( )進行的就不是全域性檢索,它只是檢索第一個匹配。但即使match( )執行的不是全域檢索,它也返回一個數組。在這種情況下,數組的第一個元素就是匹配的字串,而餘下的元素則是Regex中用括弧括起來的子運算式。因此如果match( )返回了一個數組a,那麼a[0]存放的是完整的匹配,a[1]存放的則是與第一個用括弧括起來的運算式匹配的子串,以此類推。為了和方法replace(
)保持一致,a[n]存放的是$n的內容。
例如使用如下的代碼來解析一個URL:
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"></head><body><script> 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];var protocol=result[1];var host=result[2];var path=result[3];alert(fullurl+"\n"+protocol+"\n"+host+"\n"+path);} </script> </body></html>
最後,還應該瞭解match( )的一個特性。它返回的數組和其他的數組一樣具有一個length屬性。如果match( )是作用於一個非全域的Regex,那麼它返回的數組還包括另外兩個屬性--index和input,前者包含的是在字串中匹配開始處的字元的位置,後者則是目標字串的一個副本。這樣,在上面的代碼中,result.index屬性的值應該等於17,因為匹配了的URL是從文本中的第17個字元的位置開始。而屬性result.input則應該具有和變數text相同的字串。對於沒有標誌g的Regexr和字串s,調用s.match(r)返回的值與r.exec(s)相同。我們會在後續文章中討論RegExp.exec(
)方法。
④ split( ):
這個方法可以把調用它的字串分解為一個子串數組,使用的分隔字元是它的參數。例如:
"123,456,789".split(","); //123,456,789
split( )方法也可以以Regex為參數。這種能力使該方法更強大。例如我們可以指定分隔字元,允許兩邊有任意多個空白符:
"1,2, 3 , 4 ,5".split(/\s*,\s*/); //1,2,3,4,5
split( )方法還有其他的特性,這裡不一一贅述。