JavaScript 正則表達式 選擇、分組和引用

JavaScript的正則表達式支持布爾操作,除了作爲 選擇的“布爾或”操作之外,正則表達式還支持分組和引用 。其實選擇、分組和引用的作用分別爲:指定選擇項、對子表達式分組和引用 前一子表達式的特殊字符。

正則表達式的選擇:

所謂選擇即在多個條件裏面選擇一個,比如說賣水果的大爺說送你個水果,你可以選擇“梨”,“蘋果”,“西瓜”中的任何一個。當然你會選擇西瓜,呵呵。

字符”|”用於分隔供選擇的字符 ,例如/西瓜|梨|蘋果/匹配的是“西瓜”,“梨”,或者是“蘋果”。同樣我要 是想根據昨天講過的字符類去匹配一些規則,比如我想匹配3個數字,或者是4個小寫字母就可以用模式//d{3}|[a-z]{4}/,呵呵,咋樣?即瞭解 了選擇,又用上了字符類,同時呢我們還用到了重複,這幾天講的東西都複習了一遍,哈哈。

選擇項是從左到右考慮,直到發現了匹配項。如果左邊的選擇項匹配,則忽略右邊的匹配項,即使它產生更好的匹配。

其實上面的話是很好理解的,還是拿大爺送你水果的例子,大爺第一次拿出西瓜,問你要不要?如果你選擇了西瓜,大爺自然不會再問你要不要蘋果或者梨了。而如果你不要西瓜,那麼大爺會再拿出個梨,問你要不要?就是這個道理。

正則表達式的分組:

我們可以通過使用小括號來對正則表達式進行分組 。所謂分組,其實可以理解爲合作伙伴,且是無商業利益的,合作伙伴之間的關係是一榮俱榮,一損俱損。也就是說把括號內的東西當成一個小組,一個單元。分組就就是正則表達式中的子表達式,這個我們下面的引用會講到。

一個單元就說明後面的重複規則,與前後小組間的“或”關係,都是以小組爲單位的。小組裏的東西是統一處理的。

//如下模式即可以匹配java,也可以匹配javascript
//因爲?表示的是出現0次或1次,如果一次不出現那麼就匹配的是java
//否則匹配的就是javascript
var pattern = /java(script)?/ ;

//下面代碼返回的是abcdcd,cd,ef,,efnull
var patt1= new RegExp( "(ab|cd)+|(ef)" , "g" ) ;

do
{
result= patt1.exec ( "abcdcdef" ) ;
document.write ( result) ;
}
while ( result!= null )

在JavaScript1.5中,無須創建帶編碼的引用就可以將正則表達式中的項目進行組合。它不是以括號對項目進行分組,而是以”(?:”和”)”進行的分組,不過此分組不能生成引用 (下面介紹的就是引用)。

正則表達式的引用:

在正則表達式中,其實括號的另一個作用是在完整的模式中定義子模式 。當一個正則表達式成功地和目標字符串相匹配時,可以從目標串中抽出和括號中的子模式相匹配的部分。

例如:我想要檢索的條件是3個字母加上4個數字,但是真正對我有用的是那4個數字。則可以使用如下模式進行匹配

//3個字母加4個數字的匹配模式
var pattern = /[a-z]{3}/d{4}/ ;

但是我咋能選擇匹配我的這個模式的字符串中的數字部分呢?這是一個問題。(呃,在這裏強調一下,怎麼找出符合這個模式的字符串不屬於本篇日誌內容。這裏還是先繼續挖坑。嗯。)這時候我們就需要把那個數字部分也變成分組,既然是分組,那麼我們就可以給組一個編號嘛。呵呵。

//3個字母加4個數字的匹配模式
var pattern = /[a-z]{3}(/d{4})/ ;

帶括號的子表達 式的另一個用途是允許我們在同一正則表達式的後部引用前面的子表達式 (可下引出正題來了)。這是通過在字符”/”後加一位或多位數字實現的。例如,/1引用 提第一個帶括號的子表達式,/3則表示引用的是第三個帶括號的子表達式。

由於 子表達式可以被嵌套在別的子表達式中,所以它的位置是被計數的左括號的位置。

//下例中的([Ss]cript)就被指定爲/2
var pattern = /([Jj]ava([Sscript)?)/sis/s(fun/w*)/ ;

對正則表達式中前一子表達式的引用 所指的並不是那個子表達式的模式,而是與那個模式相匹配的文本 ,這個是一定不要弄混的。因爲你想,你真正關心的也不是模式,模式只是找出你想要的東西的一個工具而已。

根據上面的規定,我就可以實證 條約束,即一個字符串各個單獨的部分包含的是完全相同的字符。例如,我下面的正則表達式匹配的就是位於單引號或者雙引號之內的0個或多個字符。如果我想要前後引號是匹配的(都是單引號或都是雙引號)就可以用上引用。

//不會管前後引號是否相同 下面代碼輸出false
var pattern = /["'][^"']*["']/ ;
document.write ( pattern .test ( "The 'best/" things in life are free" ) ) ;

//保證前後引號相同 下面代碼輸出true,false
var pattern = /(["'])[^"']*/1/ ;

document.write ( pattern.test ( "The 'best' things in life are free" ) ) ;
document.write ( pattern.test ( "The 'best/" things in life are free" ) ) ;

正則表達式的選擇、分組和引用運算符:

字符 含義
| 選擇。匹配的是該符號左邊的子表達式或右邊的子表達式,其實就是布爾“或”
(…) 組合。將幾個項目組合爲一個單元,這個單元可由*、+、?和|等符號使用,而且 還可以記住和這個組合匹配的字符以供此後的引用使用
(?:…) JavaScript 1.5中可以使用其對正則表達式進行分組,但是隻是分組。把項目組合到一個單元,但是不記憶與該組匹配的字符
/n 和第n個分組第一次匹配的字符相匹配。組是括號 中的子表達式(可嵌套,以左半括號開始數,從1開始數,一到數下去 ),以(?:…)分組的組不進行編碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章