グループ

Flash Player 9 以降、Adobe AIR 1.0 以降

次のように括弧を使用すると、正規表現の中でグループを定義できます。

/class-(\d*)/

グループはパターンの部分的なセクションであり、 次の目的で使用できます。

  • 繰り返し制御を複数の文字に適用する場合

  • 選択制御( | 文字)を適用する対象のサブパターンを区切る場合

  • 一致したサブストリングをキャプチャする場合。例えば、正規表現の中で ¥1 を使用すると、前出のグループが一致したストリングと同じ内容に一致します。また、String クラスの replace() メソッドでは同様の目的に $1 を使用できます

以降のセクションでは、グループの使用方法について詳しく説明します。

繰り返し制御に対するグループの使用

グループを使用しない場合、次のように、繰り返し制御文字はその直前にある 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

後方参照は、 ¥1 ¥2 、...、 ¥99 のように記述することにより、1 つの正規表現の中で最大 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

非キャプチャグループと先読みグループの使用

非キャプチャグループとは、キャプチャおよび番号による後方参照の機能を持たない、グループ化だけを目的としたグループです。非キャプチャグループを定義するには、次のように (?: ) を使用します。

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

特殊な非キャプチャグループとして、先読みグループと呼ばれるものがあります。さらに、これは肯定先読みグループと否定先読みグループの 2 つに分類されます。

肯定先読みグループは (?= ) で定義され、該当位置に一致する必要があるサブパターンを示しますが、肯定先読みグループに一致した部分は、同じ正規表現の中にある後続のパターンについても一致の対象となります。 例えば、次のコードに含まれている (?=e) は肯定先読みグループなので、これに一致する文字 e は、正規表現の続き(この例ではキャプチャグループの ¥w*) )についても一致を調べる対象となります。

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

否定先読みグループは (?! ) で定義され、該当位置に一致してはならないサブパターンを示します。次に、例を示します。

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 という識別子を持つ 2 つの名前付きグループを使用しています。

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 独自の拡張機能です。