グループ

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

/class-(\d*)/

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

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

サブトピック

繰り返し制御に対するグループの使用
選択制御文字 (|) に対するグループの使用
グループによる一致したサブストリングのキャプチャ
非キャプチャグループと先読みグループの使用
名前付きグループの使用

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

グループを使用しない場合、次のように、繰り返し制御文字はその直前にある 1 つの文字または文字クラスに適用されます。

var pattern:RegExp = /ab*/ ;
// 文字 a と、その後に続く
// 文字 b の 0 回以上の繰り返しに一致する

pattern = /a\d+/; 
// 文字 a と、その後に続く
// 1 桁以上の数字に一致する

pattern = /a[123]{1,3}/;
// 文字 a と、その後に続く
// 1、2、3 いずれかの 1 回以上 3 回以下の繰り返しに一致する

グループを使用すると、次のように、繰り返し制御文字を複数の文字や文字クラスに適用できます。

var pattern:RegExp = /(ab)*/;
// 文字 a とその後に続く 
// b を組み合わせた 0 回以上の繰り返しに一致する。例 : ababab

pattern = /(a\d)+/;
// 文字 a とその後に続く 
// 数字 1 桁を組み合わせた 1 回以上の繰り返しに一致する。例 : a1a5a8a3

pattern = /(spam ){1,3}/; 
// spam とそれに続く空白を組み合わせた 1 ~ 3 回の繰り返しに一致する

繰り返し制御文字の詳細については、繰り返し制御文字を参照してください。

選択制御文字 (|) に対するグループの使用

グループは、次のように選択制御文字 (|) の適用対象となる範囲を指定するために使用できます。

var pattern:RegExp = /cat|dog/;
// cat または dog に一致する

pattern = /ca(t|d)og/;
//catog または cadog に一致する

グループによる一致したサブストリングのキャプチャ

正規表現では、パターン内に通常のグループ化括弧を指定すると、後でそのグループに一致した内容を参照できます。これは "後方参照" と呼ばれる機能で、後方参照に使用するグループを "キャプチャグループ" といいます。たとえば、次の正規表現に含まれている \1 というシーケンスは、その前の括弧で指定したキャプチャグループに一致したサブストリングと同じ内容に一致します。

var pattern:RegExp = /(\d+)-by-\1/;
// 次に一致します : 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."));
// 出力: Bob, hello.

また、RegExp クラスの exec() メソッドまたは String クラスの match() メソッドでキャプチャグループを使用すると、グループに一致したサブストリングをメソッドの戻り値として取得できます。

var pattern:RegExp = /(\w+)@(\w+).(\w+)/;
var str:String = "bob@example.com";
trace(pattern.exec(str));
  // bob@test.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@test.com,bob,example,com
  
//非キャプチャ :
var pattern:RegExp = /(\w+)@(\w+).(?:com|org)/;
var str:String = "bob@example.com";
trace(pattern.exec(str));
  // bob@test.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<名前>) を使用します。たとえば、次の正規表現では、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); // 例

メモ

 

名前付きグループは、ECMAScript の言語仕様には規定されていない、ActionScript 3.0 独自の拡張機能です。


 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000118.html