您可以使用括號在規則運算式中指定群組,如下所示:
/class-(\d*)/
群組是模式的子區段。您可以使用群組來執行下列作業:
下列章節提供有關群組使用方式的詳細資訊。
搭配數量詞使用群組
如果您不使用群組,數量詞會套用至其前面的字元或字元類別,如下所示:
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
以下是另一個範例,它使用兩個已命名群組,識別名稱是
name
和
dom
:
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 的附加功能。