flash as3.0 正則表達式

正則表達式:
       正則表達式最早是由數學家Stephen Kleene在對自然語言的遞增研究成果的基礎上,於1956提出來的。具有完整語法的正則表達式,主要使用在字符串的格式的匹配方面上,後來也逐漸應用到信息技術領域。不同的編程語言對於正則表達式有細微的不同,ActionScript 3.0是按照ECMAScript第3版語言規範(ECMA-262)中的定義實現正則表達式。
熟悉windows操作系統讀者,應該知道windows中是怎樣查找文件的。不錯,使用通配符“*”用來匹配任意字符,“?”用來匹配一個字符,來實現搜索功能的。
       字符是計算機軟件處理文字時最基本的單位,可能是字母,數字,標點符號,空格,換行符,漢字等等。字符串是0個或更多個字符的序列。文本也就是文字,字符串。說某個字符串匹配某個正則表達式,通常是指這個字符串裏有一部分(或幾部分分別)能滿足表達式給出的條件。
       在編寫處理字符串的程序或網頁時,經常會有查找符合某些複雜規則的字符串的需要。正則表達式就是用於描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼。
        在ActionScript 3.0中引入了強大的字符串處理工具――正則表達式。正則表達式主要用於驗證文本字段的值是否符合特定模式,比如驗證用戶輸入的電話號碼位數是否正確;或者替換與特定模式匹配的部分文本值。

正則表達式的構成:正則表達式一般由兩個部分組成。一部分是在雙斜槓內部的字符串,稱爲匹配模式,用來表示要匹配的字符串的特徵;另一部分是在第二個斜槓的後面,是一個字母,叫做正則表達式的標誌位,由五個字母組合而成,匹配模式由兩部分組成,分別爲:普通字符(例如字符a到z)和特殊字符(稱爲元字符)。正則表達式描述在查找字符串時待匹配的一個或多個字符串。正則表達式作爲一個模板,將某個字符模式與所搜索的字符串進行匹配。
正則表達式的定義方法有兩種,一種是上例中的方法,使用雙斜槓來定義,語法格式如下所示:
var re1:RegExp=/\d{3}/g;
var re2:RegExp=new RegExp("\d{3}","g");

正則表達式的語法:ActionScript 3.0中的正則表達式是按照ECMAScript第3版語言規範(ECMA-262)中語言規範的定義的。在實際應用過程中,正則表達式都比較複雜。不過複雜的正則表達式都是按照一定的語法規則組合而成。
1)正則表達式中的普通字符
正則表達式中的普通字符,包括大小寫英文字母,從0到9的數字和除了元字符的其它字符,比如#、!等。注意,中文也屬於普通字符,不過它在正則表達式中使用Unicode碼錶示。由普通字符組成的正則表達式是簡單的正則表達式。
下面是幾個使用普通字符的正則表達式,代碼如下所示:
//使用英文字母作爲正則表達式匹配模式
var pattern1:RegExp = /hello/;
//使用中文字符作爲正則表達式匹配模式
var pattern2:RegExp = /正則/;
//使用中英文混合字符作爲正則表達式匹配模式
var pattern3:RegExp = /正則hello/;
//使用符號和英文字母作爲正則表達式匹配模式
var pattern4:RegExp = /#hello~/;

2)正則表達式中的元字符
正則表達式中定義了一些具有特殊含義的字符,這些字符在正則表達式中有特殊的含義,稱爲元字符。ActionScript 3.0中的元字符如表17-1所示:
1.匹配字符串頭部字符
2.匹配字符串尾部字符
3.反斜槓轉義字符
4.匹配單個字符
5.數量表示符
6.邏輯“或”操作符

3)正則表達式中的元序列
元序列是指在ActionScript 3.0中具有特殊含義的字符序列。ActionScript 3.0中的元序列如表所示:
元序列     說  明
{n}{n,}和{n,n}   指定前一項目的數值數量或數量範圍,屬於數量標識符。 
\b      匹配單詞字符和非單詞字符之間的位置。
\B      匹配兩個單詞字符之間的位置,也匹配兩個非單詞字符之間的位置。
\d      匹配十進制數字。
\D      匹配除數字以外的任何字符。
\f      匹配換頁符。
\n      匹配換行符。
\r      匹配回車符。
\s      匹配任何空白字符(空格、製表符、換行符或回車符)。
\S      匹配除空白字符以外的任何字符。
\t      匹配製表符。
\unnnn     匹配字符代碼由十六進制數字 nnnn 指定的 Unicode 字符。
\v      匹配垂直換頁符。
\w      匹配單詞字符(A-Z、a-z、0-9 或 _)。請注意,\w 不匹配非英文字符,如 é、Ò 或 Á。
\W      匹配除單詞字符以外的任何字符。
\xnn     匹配具有指定 ASCII 值(由十六進制數字 nn定義)的字符。

4)正則表達式中的字符類
字符類是指定義的一組字符以匹配正則表達式中的一個位置。此類使用元字符方括號[]來定義。例如,下面的正則表達式定義了匹配mat、mbt、mct、mdt或met的字符類:
/m[abcde]t/
字符類實現了字符類中只有一個字符符合特徵要求,那麼就能夠實現字符串的匹配。下面示例實現字符類的匹配操作,代碼如下所示:
//定義要檢測的字符正則表達式
//檢查字符串中是否存在正×則
var pattern1:RegExp = /正[123]則/g;
//要檢測的字符串
var str1:String="正1則表達式/是一段檢測代碼,可以是正2則"
//使用String類的match()方法驗證
trace(str1.match(pattern1))//輸出:正1則,正2則
trace(str1.match(pattern1).length)//輸出:2,說明有2個匹配

5)正則表達式中的標誌位
標誌指指定有關應如何使用正則表達式模式的一些選項,如是否區分大寫和小寫字符等。這些標誌對應與正則表達式類的屬性。在ActionScript3.0中有5個標誌位,如表所示:
標誌  屬性   說    明
g   global   匹配多個匹配。
i   ignoreCase  不區分大小寫的匹配。應用於 A-Z 和 a-z 字符,但不能應用於擴展字符,如 É 和 é。
m   multiline  設置此標誌後,$ 和 ^ 可以分別匹配行的開頭和結尾。
s   dotall   設置此標誌後,.(點)可以匹配換行符 (\n)。
x   extended  允許擴展的正則表達式。

正則表達式的用法:
在ActionScript3.0中,要搜索和檢測正則表達式,既可以利用RegExp類的方法來實現,也可以利用String類的方法類來實現。
1)RegExp類
RegExp類是ActionScript 3.0中的頂級類,它允許使用正則表達式在字符串中執行搜索和替換文本的模式。其有7個屬性,如表所示:

正則表達式類屬性

屬性   返回類型  說明
dotall   Boolean  指定正則表達式模式中的點字符(.)是否與換行符相匹配。
extended  Boolean  指定是否爲正則表達式使用擴展模式。
global   Boolean  指定是否爲正則表達式使用全局匹配。
ignoreCase  Boolean  指定正則表達式是否忽略大小寫。
lastIndex  Number   指定字符串中開始進行下一次搜索的索引位置。
multiline  Boolean  指定是否設置了 m(多行)標誌。
source   String   指定正則表達式的模式部分。

2)String類的方法應用
String類與正則表達式的結合,能夠實現更爲豐富的匹配和搜索效果。在ActionScript 3.0中,String類的search()方法、match()方法和replace()方法常用於正則表達式操作。本節將介紹這三種方法與正則表達式的綜合應用。
search()方法主要用於查找作業,返回搜到的字符串的位置索引;match()方法實現的是匹配作業,返回的是匹配的字符串;replace()方法實現替換作業,返回的是替換的結果。


AS3中的正則表達式是RegExp頂級類的實例。這意味着使用RegExp對象時不需要import任何類。

☆理解正則表達式標記
默認情況下,所有標記都爲關閉狀態。
  g:全局標記,允許表達式在源文本中重複使用,直到沒有其他匹配爲止。如果未設定該標記,則表達式將返回第一個匹配。
  i:忽略大小寫標記,默認情況下,所有字母數字比較都是大小寫敏感的。
  m:多行標記,修改^和$錨點在表達式中的行爲。關閉時,它們匹配整個文本的首末字符,開啓後,它們匹配每行的首末字符。
  s:dotall標記,未設定時點匹配換行符之外的所有字符,設定後點匹配包括換行符在內的任何可能的字符。singleline
  x:擴展標記,設定後將忽略表達式中的空白符,除非經過轉義
  全局標記適用於match()、replace()、test()、exec()方法。在String.match()中,它將決定返回第一個匹配和捕獲分組的數組(未設定),還是返回所有匹配的數組(設定);在String.replace()中,該標記將指定替換第一個匹配(未設定)還是替換所有匹配(設定)。在RegExp.test()和RegExp.exec()中,如果設定了全局標記,則表達式將繼續匹配源文本中的第n個字符,其中n是表達式的lastIndex屬性。該屬性在每次匹配之後設定,因此如果設定了全局標記,則可以使用RegExp.test()或RegExp.exec()通過循環漸進式遍歷所有的匹配。如果未設定全局標記,這些方法將返回從第一個字符開始的第一處匹配。
☆應用正則表達式
·測試
RegExp.test(str:String):Boolean
·定位
String.search(pattern:*):int //沒有匹配則返回-1
RegExp.exec(str:String):Object //沒有匹配則返回null,這是一個有狀態的函數,可以記住上次匹配的位置
var s:String="H12_34_BCD";
var r:RegExp=/\d{2}/ig;
var obj:Object=r.exec(s);
if(obj!=null){
   trace(obj);//12
   trace(obj.index);//1
}
obj=r.exec(s);
if(obj!=null){
   trace(obj);//34
   trace(obj.index);//4
}
·識別
RegExp.exec(str:String):Object

var s:String="H12_34_BCD";
var r:RegExp=/\d{2}/ig;
var obj:Object;
while(obj=r.exec(s)){
   for(var o:String in obj){
    trace(o,obj[o]);
   }
}
/*
   輸出結果
   0 12
   index 1
   input H12_34_BCD
   0 34
   index 4
   input H12_34_BCD
   exec()返回的對象包含帶有下標的屬性和命名屬性,並且第一個下標含有與模式匹配的文本
*/
String.match(pattern:*):Array
返回與傳遞給它的模式相匹配的字符串,沒有匹配返回null。
var s:String="H12_34_BCD";
var r:RegExp=/\d{2}/ig;
var obj:Array=s.match(r);
trace(obj.length);//2
·提取
String.match(pattern:*):Array

var s:String="H12_34_BCD";
var r1:RegExp=/_(\d{2})/g;
var r2:RegExp=/_(\d{2})/;
trace(s.match(r1).length);//1
trace(s.match(r2).length);//2
trace(s.match(r2)[0]);//_34
trace(s.match(r2)[1]);//34
傳遞給match()方法的表達式擁有全局標記集時,將在數組中返回與模式匹配的所有字串。其中包含所有捕獲的內容。
傳遞給match()方法的表達式沒有任何全局標記集時,它將在數組中返回第一個匹配的子串和該匹配表達式中的捕獲分組。
RegExp.exec(str:String):Object

var s:String="H12_34_BCD";
var r:RegExp=/((\d)(\d))/ig;
var obj:Object;
while (obj=r.exec(s)) {
   for (var o:String in obj) {
    trace(o,obj[o]);
   }
}
/*
   輸出結果
   0 12
   1 12
   2 1
   3 2
   index 1
   input H12_34_BCD
   0 34
   1 34
   2 3
   3 4
   index 4
   input H12_34_BCD
   從結果可以看到exec()方法更方便些
*/
·替換
String.replace(pattern:*,repl:Object):String
如果表達式中含有捕獲分組,那麼在替換文本時可以在替換字符串內部使用捕獲文本。通過在替換字符串中使用命名爲$1、$2……$99的變量,可以在替換文本中使用第1、第2和第99個捕獲分組。
要爲替換文本添加幾分色彩,可以向replace()方法傳遞一個替換函數,而不是替換字符串。函數將接收匹配文本、該匹配的所有捕獲分組和上下文中的完整字符串,並且可以實現任何所需的替換操作。
var s:String="H12_34_BCD";
var r:RegExp=/\d(\d)/ig;
var refun:Function=function refun(...args):String{
   var rtn:String;
   for(var i:int=0;i<args.length;i++){
    rtn=args[i];
    trace("------",rtn);
   }
   return rtn;
}
trace(s.replace(r,refun));
/*
   輸出結果
   ------ 12
   ------ 2
   ------ 1
   ------ H12_34_BCD
   ------ 34
   ------ 4
   ------ 4
   ------ H12_34_BCD
   HH12_34_BCD_H12_34_BCD_BCD
*/
·拆分
String.split(delimiter:*,limit:Number=0x7fffffff):Array

☆構建表達式
如果設定了dotall標記,那麼.將匹配任何字符,包括換行符。
var con:String=
"Call us at one of these numbers.\n"+
"Los Angeles:310-555-2910\n"+
"New York:212-555-2499\n"+
"Boston: 617-555-7141";
var re:RegExp=/^([\w\s]+):\s*(\d{3}-\d{3}-\d{4})/gm;
//var matches:Array=con.match(re);
//for(var i:int=0;i<matches.length;i++){
// trace(matches[i]);
//}
var obj:Object;
while(obj=re.exec(con)){
trace(obj[2]);
}
☆構建高級表達式
var s:String=
"<a href=\"http://www.baidu.com\"><span class=\"seoa\">BaiDu</span></a>\n"+
"<a href=\"http://www.google.cn\">Google</a>\n"+
"<li>Ha~~~</li>\n";
var r:RegExp=/<(\w+)[^>]*> .*? <\/\1>/ixg;
var o:Object;
while(o=r.exec(s)){
trace(o[0]);
}

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