JScript での逆参照
前方参照は、繰り返し出現する文字グループの検索に使用されます。 これらは、入力文字列の要素の順序と位置を並べ替えることで、入力文字列の書式を再設定するためにも使用されます。
部分式は、正規表現から、また置換文字列から参照できます。 各部分式は番号で識別され、前方参照と呼ばれます。
正規表現内のかっこは、部分式の作成に使用されます。 結果のサブマッチは、プログラムで取得できます。 詳細については、「代替と部分式」を参照してください。
前方参照の使用
部分式は、正規表現から参照できます。
正規表現では、保存される各サブマッチは、左から右の順に保存されます。 サブマッチが保存されるバッファー番号は 1 から始まり、最大 99 までです。 正規表現では、各バッファーにアクセスするには、\n を使用します。ここで、n はバッファーを指定する 1 桁または 2 桁の数字です。
前方参照の 1 つの用途は、文字列内でまとまって出現する 2 つの同じ単語の一致候補を特定することです。 次に例を示します。Is is the cost of of gasoline going up up?
この文には、いくつかの重複する単語が含まれます。 単語の重複を 1 つずつ調べる必要なしに、このような文を修正できると便利です。 次の JScript 正規表現では、これを実現するために 1 つの部分式を使用しています。
/\b([a-z]+) \1\b/gi
このケースの部分式は、かっこで囲まれている部分すべてです。 その部分式には、[a-z]+ で指定されているように、1 つ以上の英字が含まれています。 正規表現の 2 番目の部分は、その前に保存されたサブマッチへの参照です。つまり、かっこ内の正規表現と一致した 2 つ目の一致候補です。 \1 は、最初のサブマッチを指定するために使用されます。
ワード境界を表す \b メタ文字によって、個別の単語だけが検出されます。 メタ文字を指定しないと、正規表現によって "is issued" や "this is" なども間違って検出されてしまいます。
重複する単語を一覧表示する例を次に示します。 これは、一致とサブマッチをコードでどのように取得できるかを示しています。
var result;
var re = /\b([a-z]+) \1\b/gi
var src = "Is is the cost of of gasoline going up up?"
// Get the first match.
result = re.exec(src);
while (result != null)
{
// Show the entire match.
print();
print(result[0]);
// Show the submatches.
for (var index = 1; index < result.length; index++)
{
print("submatch " + index + ": " + result[index]);
}
// Get the next match.
result = re.exec(src);
}
// Output:
// Is is
// submatch 1: Is
// of of
// submatch 1: of
// up up
// submatch 1: up
部分式は、置換文字列から参照することもできます。
上に示した正規表現を使用すると、次の例では、2 つの連続したまったく同じ単語が、同じ単語 1 つと置換されます。 replace メソッドでは、$1 は 1 番目に保存されたサブマッチを参照します。 サブマッチが複数ある場合は、続けて $2、$3 などとして参照します。
var re = /\b([a-z]+) \1\b/gi
var src = "Is is the cost of of gasoline going up up?"
var result = src.replace(re, "$1");
print(result);
// Output:
// Is the cost of gasoline going up?
文字列の中の単語の各ペアを入れ替える例を次に示します。
var re = /(\S+)(\s+)(\S+)/gi
var src = "The quick brown fox jumps over the lazy dog."
var result = src.replace(re, "$3$2$1");
print(result);
// Output:
// quick The fox brown over jumps lazy the dog.