尋找字串中的子字串和樣式

子字串是字串內的連續字元。例如,字串 "abc" 有下列子字串:"""a""ab""abc""b""bc""c"。您可以使用 ActionScript 方法找出字串的子字串。

樣式在 ActionScript 中是由字串或規則運算式所定義的。例如,下列規則運算式會定義特定樣式,即字母 A、B 和 C,後面接著一個數字字元 (正斜線是規則運算式的分隔符號):

/ABC\d/

ActionScript 提供方法來尋找字串中的樣式,以及用取代子字串來取代找到的符合項目。下列幾節會說明這些方法。

規則運算式可定義複雜樣式。如需詳細資訊,請參閱使用規則運算式

副主題

依字元位置找出子字串
找出相符子字串的字元位置
建立由分隔符號區分的子字串陣列
尋找字串中的樣式並取代子字串

依字元位置找出子字串

substr()substring() 方法很相似。這兩個方法都會傳回字串的子字串,而且都會使用兩個參數。在這兩種方法中,第一個參數都是給定的字串中開頭字元的位置。但是,substr() 方法的第二個參數是要傳回子字串的「長度」,而substring() 方法的第二個參數則是子字串「結尾」字元的位置 (傳回的字串不含在此位置的字元)。本範例展示這兩種方法的差異:

var str:String = "Hello from Paris, Texas!!!";
trace(str.substr(11,15)); // 輸出:Paris, Texas!!!
trace(str.substring(11,15)); // 輸出:Pari

slice() 方法的作用類似於 substring() 方法。指定兩個非負數的整數當成參數時,結果是相同的。但是,slice() 方法可以使用負值整數做為參數,在這種情況下,字元位置會從字串結尾算起,如下列範例所示:

var str:String = "Hello from Paris, Texas!!!";
trace(str.slice(11,15)); // 輸出:Pari
trace(str.slice(-3,-1)); // 輸出:!!
trace(str.slice(-3,26)); // 輸出:!!!
trace(str.slice(-3,str.length)); // 輸出:!!!
trace(str.slice(-8,-3)); // 輸出:Texas

您可以結合非負值和負值整數,當成 slice() 方法的參數。

找出相符子字串的字元位置

您可以使用 indexOf()lastIndexOf() 方法,找出字串內相符的子字串,如下列範例所示:

var str:String = "The moon, the stars, the sea, the land";
trace(str.indexOf("the")); // 輸出:10

請注意,indexOf() 方法區分大小寫。

您可以指定第二個參數,指出要在字串中開始搜尋的索引位置,如下所示:

var str:String = "The moon, the stars, the sea, the land"
trace(str.indexOf("the", 11)); // 輸出:21

lastIndexOf() 方法會找出子字串在字串中最後出現的位置:

var str:String = "The moon, the stars, the sea, the land"
trace(str.lastIndexOf("the")); // 輸出:30

如果您指定 lastIndexOf() 方法的第二個參數,即會從該索引位置以回溯方式搜尋字串 (從右到左):

var str:String = "The moon, the stars, the sea, the land"
trace(str.lastIndexOf("the", 29)); // 輸出:21

建立由分隔符號區分的子字串陣列

您可以使用 split() 方法,依照分隔符號來拆解字串,據以建立子字串陣列。例如,您可以將以逗點分隔和定位點分隔的字串,區分為數個字串。

下列範例顯示如何使用連字號 (&) 字元當成分隔符號,將陣列拆解為子字串:

var queryStr:String = "first=joe&last=cheng&title=manager&StartDate=3/6/65";
var params:Array = queryStr.split("&", 2); // params == ["first=joe","last=cheng"]

split() 方法的第二個參數是選擇性的,會定義所傳回陣列的大小上限。

您也可以使用規則運算式當做分隔符號字元:

var str:String = "Give me\t5."
var a:Array = str.split(/\s+/); // a == ["Give","me","5."]

如需詳細資訊,請參閱使用規則運算式和「ActionScript 3.0 語言和組件參考」。

尋找字串中的樣式並取代子字串

String 類別包含下列方法,可處理字串中的樣式:

下列幾節會說明這些方法。

您可以使用字串或規則運算式定義這些方法所用的樣式。如需有關規則運算式的詳細資訊,請參閱使用規則運算式

尋找符合的子字串

search() 方法會傳回符合特定樣式的第一個子字串的索引位置,如下列範例所示:

var str:String = "The more the merrier.";
// (此搜尋區分大小寫)
trace(str.search("the")); // 輸出:9

您也可以使用規則運算式定義比對的樣式,如下列範例所示:

var pattern:RegExp = /the/i;
var str:String = "The more the merrier.";
trace(str.search(pattern)); // 0

trace() 方法的輸出為 0,因為字串中第一個字元的索引位置為 0。規則運算式中設定了 i 旗標,因此搜尋不區分大小寫。

search() 方法只找到一個符合的項目,並傳回其開頭索引位置,即使規則運算式設定了 g (全域) 旗標。

下列範例顯示一個更複雜的規則運算式,這個規則運算式會比對雙引號中的字串:

var pattern:RegExp = /"[^"]*"/;
var str:String = "The \"more\" the merrier.";
trace(str.search(pattern)); // 輸出:4

str = "The \"more the merrier.";
trace(str.search(pattern)); // 輸出:-1
// (表示沒有符合的項目,因為沒有右雙引號)。

match() 方法有類似的運作方式,也會搜尋相符的子字串。但是,當您在規則運算式樣式中使用全域旗標時 (如下列範例所示),match() 會傳回符合子字串的陣列:

var str:String = "bob@example.com, omar@example.org";
var pattern:RegExp = /\w*@\w*\.[org|com]+/g;
var results:Array = str.match(pattern);

results 陣列會設定如下:

["bob@example.com","omar@example.org"]

如需有關規則運算式的詳細資訊,請參閱使用規則運算式

取代符合的子字串

您可以使用 replace() 方法在字串中搜尋指定的樣式,然後使用指定的取代字串來取代符合的項目,如下列範例所示:

var str:String = "She sells seashells by the seashore.";
var pattern:RegExp = /sh/gi;
trace(str.replace(pattern, "sch"));
    //sche sells seaschells by the seaschore. 

請注意,在這個範例中,符合的字串不區分大小寫,因為規則運算式中設定了 i (忽略大小寫) 旗標,此外也取代多個符合的項目,這則是因為設定了 g (全域) 旗標。如需詳細資訊,請參閱使用規則運算式

您可以在取代字串中加入下列 $ 取代程式碼。下表顯示的取代文字會插入來代替 $ 取代程式碼:

$ 程式碼

取代文字

$$

$

$&

符合的子字串。

$`

符合之子字串前面的字串部分。此程式碼會使用半形左單引號字元 (`),而非半形單引號 (') 或左智慧單引號 (')。

$'

符合之子字串後面的字串部分。此程式碼會使用半形單引號 (')。

$n

第 n 個擷取到的額外符合群組,其中 n 是 1 到 9 的單一位數,而且 $n 的後面沒有小數位數。

$nn

第 nn 個擷取到的額外符合群組,其中 nn 是 01 到 99 的兩位數。如果未定義第 nn 個擷取,取代文字會是空字串。

例如,以下會說明 $2$1 取代程式碼的用法,這些程式碼代表擷取到的第一個與第二個符合群組:

var str:String = "flip-flop";
var pattern:RegExp = /(\w+)-(\w+)/g;
trace(str.replace(pattern, "$2-$1")); // flop-flip

您也可以使用函數當做 replace() 方法的第二個參數。符合的文字會由函數的傳回值取代。

var str:String = "Now only $9.95!";
var price:RegExp = /\$([\d,]+.\d+)+/i;
trace(str.replace(price, usdToEuro));

function usdToEuro(matchedSubstring:String, 
capturedMatch1:String,
index:int,
str:String):String { var usd:String = capturedMatch1; usd = usd.replace(",", ""); var exchangeRate:Number = 0.853690; var euro:Number = usd * exchangeRate; const euroSymbol:String = String.fromCharCode(8364); return euro.toFixed(2) + " " + euroSymbol; }

當您使用函數做為 replace() 方法的第二個參數時,下列引數會傳遞至函數:


Flash CS3

 

有新的意見加入至這個頁面時,傳送電子郵件給我 | 意見報告

目前頁面: http://livedocs.adobe.com/flash/9.0_tw/main/00000084.html