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

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

子字串是字串內的連續字元。例如,字串 "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)); // output: Paris, Texas!!! 
trace(str.substring(11,15)); // output: Pari

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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."]

如需詳細資訊,請參閱使用規則運算式適用於 Adobe Flash Platform 的 ActionScript 3.0 參考

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

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

  • 使用 match()search() 方法,可以找出符合樣式的子字串。

  • 使用 replace() 方法可以尋找符合樣式的子字串,然後使用指定的子字串取代這些子字串。

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

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

尋找符合的子字串

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

var str:String = "The more the merrier."; 
// (This search is case-sensitive.) 
trace(str.search("the")); // output: 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)); // output: 4 
 
str = "The \"more the merrier."; 
trace(str.search(pattern)); // output: -1  
// (Indicates no match, since there is no closing double quotation mark.)

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 (ignoreCase) 旗標,此外也取代多個符合的項目,這是因為設定了 g (global) 旗標。如需詳細資訊,請參閱使用規則運算式

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

$ 程式碼

取代文字

$$

$

$&

符合的子字串。

$`

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

$'

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

$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 = parseFloat(usd) * exchangeRate; 
    const euroSymbol:String = String.fromCharCode(8364); 
    return euro.toFixed(2) + " " + euroSymbol; 
}

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

  • 字串的符合部分。

  • 任何擷取到的括號群組相符項目。以此方式傳遞的引數將取決於括號群組的相符項目數而有所不同。您可以檢查函數程式碼內的 arguments.length - 3,判斷括號符合項目的數目。

  • 相符項目在字串中開始的索引位置。

  • 完整的字串。