JavaScript 用於模式匹配的 RegExp 方法

本篇日誌先主要討論 RegExp 對象的部分方法,RegExp 對象定義了兩個用於模式匹配的方法,它們是exec()test() 下面我們逐一進行講解 。呵,和上篇日誌一樣的介紹,看來套話,果然適用於多個場合。嗯。

exec() 檢索字符串中的指定值,返回值是被找到的值,如果沒有發現匹配,則返回 null:

主要的RegExp模式匹配方法是exec(),其與上一篇介紹的String對象的match方法相似,只不過它是以字符串爲參數的RegExp方法,而不是以RegExp對象爲參數的字符串方法。呼,這一句有點像繞口令,沒辦法,書上的原話,抄過來讓大家樂一樂,呵。exec()方法在一個字符串中檢索匹配,如果沒有找到任何匹配返回null,如果它找到了一個匹配,將返回一個數組。

就像方法match()爲非全局檢索返回的數組一樣。這個數組的元素0包含的是與正則表達式相匹配的字符串,餘下的所有元素包含的是與子表達式相匹配的子串,而且屬性index包含了匹配發生的字符的位置,屬性input引用的是被檢索的字符串。

/*
i is 0  http://www.xiaoxiaozi.com/index.php
i is 1  http
i is 2  www.xiaoxiaozi.com
i is 3  index.php
i is index  11
i is input  my home is http://www.xiaoxiaozi.com/index.php
*/

var str = 'my home is http://www.xiaoxiaozi.com/index.php' ;
var pattern = /(/w+):////([/w.]+)//(/S*)/ ;
//var result = str.match(pattern);
var result = pattern.exec ( str) ;
for ( i in result)
{
        document.write ( "i is " + i+ "&nbsp;&nbsp;" + result[ i] + "<br/>" ) ;
}

與match()方法不同的是,exec()返回的數組類型不同,無論該正則表達式是否含有全局屬性g。因爲當含有全局屬性g的時 候,match()方法返回的是一個匹配的數組,而調用exec()方法的RegExp有一個lastIndex屬性,它將把該對象的lastIndex 屬性設置到緊接着匹配子串的字符位置。

當同一個RegExp對象第二次調用exec()時,它將從lastIndex屬性所指示的字符處開始檢索,如果exec()沒有發現任何匹配,它 會將lastIndex屬性重圍爲0,(在任何時候你都可以將lastIndex屬性設爲0,每當你在一個字符串中找到最後一個匹配之前就開始用同一個 RegExp對象來檢索另一個字符串,而放棄了原來的檢索的時候就方法應該這樣做)。這一特殊的行爲使得你可以反覆調用exec()遍歷一個字符串中所有 的正則表達式匹配。

/*
Matched 'Java' at position 0 ; next search begins at 4
Matched 'Java' at position 28 ; next search begins at 32
*/

var pattern = /Java/g ;
var text = "JavaScript is more fun than Java!" ;
var result;
while ( ( result = pattern.exec ( text) ) != null )
{
        document.write ( "Matched '" + result[ 0 ] + "'" +
                " at position " + result.index +
                " ; next search begins at " + pattern.lastIndex + "<br/>" ) ;
}

test() 檢索字符串中的指定值,返回值是 true 或 false:

這個方法就要簡單的多了,也是我平時用的最多的一個方法,它的作用就是檢查字符串中是否包含正則表達式的一個匹配。如果包含,則返回true,否則就返回false。

當一個全局正則表達式調用test()時,它的行爲和方法exec()相同,即它從lastIndex指定的位置處開始檢索特定的字符串,如果它發 現了匹配,就將lastIndex設置爲緊接在那個匹配之後的字符的位置。這樣我們也可以使用方法test()來遍歷字符串,就像用exec()方法一 樣。

/*
next search begins at 4
next search begins at 32
*/

var pattern = /Java/g ;
var text = "JavaScript is more fun than Java!" ;
var result;
while ( result = pattern.test ( text) )
{
        document.write ( " next search begins at " + pattern.lastIndex + "<br/>" ) ;
}

總結及嘮叨:

這篇寫的可能有些暈,大家對lastIndex可能不是很理解,這裏再廢話一下,String的方法search()、replace()和match()都沒有像RegExp的exec()和test()那樣使用RegExp 對象的lastIndex屬性(對,這個屬性是RegExp也就是正則表達式對象的屬性),事實上,String方法只是將lastIndex重置爲0. 並且大家一定要記住,在用exec()和test()時,只有匹配標誌爲g全局的時候纔會有這個lastIndex屬性的改變

正則表達式是一門高深的學問,自問水平不行,這裏只是照着書中的例子操作了一番,還沒有敲太高深的例子,自己看不懂哈。 呵呵。學學是很有必要的,但是水平有限,如果大家有興趣的話,可以自己去買書鑽研一下,這裏不再多說了。

持續半個月之久的JavaScript正則表達式系列已經結束了,開心。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章