群組

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

您可以使用括號在規則運算式中指定群組,如下所示:

/class-(\d*)/

群組是模式的子區段。您可以使用群組來執行下列作業:

  • 將數量詞套用至一個以上的字元。

  • 區隔要套用替代的子模式 (藉由使用 | 字元)。

  • 擷取子字串相符項目 (例如,藉著在規則運算式中使用 \1 以比對之前相符的群組,或是在 String 類別的 replace() 方法中以類似方式使用 $1)。

下列章節提供有關群組使用方式的詳細資訊。

搭配數量詞使用群組

如果您不使用群組,數量詞會套用至其前面的字元或字元類別,如下所示:

var pattern:RegExp = /ab*/ ; 
// matches the character a followed by 
// zero or more occurrences of the character b 
 
pattern = /a\d+/;  
// matches the character a followed by  
// one or more digits 
 
pattern = /a[123]{1,3}/; 
// matches the character a followed by  
// one to three occurrences of either 1, 2, or 3

然而,您可以使用群組,將數量詞套用至一個以上的字元或字元類別:

var pattern:RegExp = /(ab)*/; 
// matches zero or more occurrences of the character a  
// followed by the character b, such as ababab 
 
pattern = /(a\d)+/; 
// matches one or more occurrences of the character a followed by  
// a digit, such as a1a5a8a3 
 
pattern = /(spam ){1,3}/;  
// matches 1 to 3 occurrences of the word spam followed by a space

如需有關數量詞的詳細資訊,請參閱數量詞

使用帶有替代 (|) 字元的群組

您可以使用群組來定義您要套用替代 (|) 字元的字元群組,如下所示:

var pattern:RegExp = /cat|dog/; 
// matches cat or dog 
 
pattern = /ca(t|d)og/; 
// matches catog or cadog

使用群組來擷取子字串相符項目

若您在模式中定義標準的括號群組,那麼稍後就可以在規則運算式中加以參考。這就稱為「後參考」,而這類群組稱為「擷取群組」。例如,在下列規則運算式中,序列 \1 會比對與擷取括號群組相符的任何子字串:

var pattern:RegExp = /(\d+)-by-\1/; 
// matches the following: 48-by-48

您可以在規則運算式中指定最多 99 個這種後參考,只要輸入 \1\2、...、\99 即可。

同樣的,在 String 類別的 replace() 方法中,您可以使用 $1–$99,在取代字串中插入所擷取的群組子字串相符項目:

var pattern:RegExp = /Hi, (\w+)\./; 
var str:String = "Hi, Bob."; 
trace(str.replace(pattern, "$1, hello.")); 
  // output: Bob, hello.

另外,若使用擷取群組,RegExp 類別的 exec() 方法和 String 類別的 match() 方法會傳回與擷取群組相符的子字串:

var pattern:RegExp = /(\w+)@(\w+).(\w+)/; 
var str:String = "bob@example.com"; 
trace(pattern.exec(str)); 
  // bob@example.com,bob,example,com

使用非擷取群組和 lookahead 群組

非擷取群組僅用於群組,而不是「收集而來」的,而且不符合已編號的後參考,使用 (?: ) 來定義非擷取群組的情況將如下所示:

var pattern = /(?:com|org|net);

舉例來說,請注意在擷取群組與非擷取群組中放置 (com|org) 的差異 (exec() 方法將擷取群組列在完全相符的項目之後):

var pattern:RegExp = /(\w+)@(\w+).(com|org)/; 
var str:String = "bob@example.com"; 
trace(pattern.exec(str)); 
// bob@example.com,bob,example,com 
 
//noncapturing: 
var pattern:RegExp = /(\w+)@(\w+).(?:com|org)/; 
var str:String = "bob@example.com"; 
trace(pattern.exec(str)); 
  // bob@example.com,bob,example

lookahead 群組是一種特殊類型的非擷取群組,這種群組共有兩種類型:「正 lookahead 群組」和「負 lookahead 群組」。

使用 (?=) 來定義正 lookahead 群組的話,此群組指定群組中的子模式必須在位置上相符。然而,字串中符合正 lookahead 群組的部分,可以比對規則運算式中其餘模式。例如,由於 (?=e) 在下列程式碼中是正 lookahead 群組,它所比對的字元 e 可藉由規則運算式的後續部分進行比對。在此範例中,是擷取群組 \w*)

var pattern:RegExp = /sh(?=e)(\w*)/i; 
var str:String = "Shelly sells seashells by the seashore"; 
trace(pattern.exec(str)); 
// Shelly,elly

使用 (?! ) 來定義負 lookahead 群組的話,此群組指定群組中的子模式「不得」在位置上相符。例如:

var pattern:RegExp = /sh(?!e)(\w*)/i; 
var str:String = "She sells seashells by the seashore"; 
trace(pattern.exec(str)); 
// shore,ore

使用已命名群組

已命名群組是規則運算式中一種群組類型,具有已命名的識別名稱。請使用 (?P<name>) 來定義已命名群組。例如,下列規則運算式包含帶有名為 digits 識別名稱的已命名群組:

var pattern = /[a-z]+(?P<digits>\d+)[a-z]+/;

當您使用 exec() 方法時,會新增相符的已命名群組,以做為 result 陣列的屬性:

var myPattern:RegExp = /([a-z]+)(?P<digits>\d+)[a-z]+/;  
var str:String = "a123bcd"; 
var result:Array = myPattern.exec(str); 
trace(result.digits); // 123

以下是另一個範例,它使用兩個已命名群組,識別名稱是 namedom

var emailPattern:RegExp =  
    /(?P<name>(\w|[_.\-])+)@(?P<dom>((\w|-)+))+\.\w{2,4}+/;  
var address:String = "bob@example.com"; 
var result:Array = emailPattern.exec(address); 
trace(result.name); // bob 
trace(result.dom); // example
備註: 已命名群組並非 ECMAScript 語言規格的一部分,而是 ActionScript 3.0 的附加功能。