後方参照: \1, \2
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
後方参照は、前回のキャプチャグループの部分一致を参照し、そのグループと同じテキストに一致します。名前付きキャプチャグループの場合は、名前付き後方参照構文を使用する方ができればよいでしょう。
構文
\N
メモ: N
はリテラル文字ではありません。
引数
N
-
キャプチャグループの番号を参照する正の値。
解説
後方参照は、前回キャプチャグループによって一致したのと同じテキストに一致する方法です。キャプチャリンググループは 1 から数えるので、最初のキャプチャリンググループの結果は \1
で参照し、2 つ目は \2
で参照し、といった具合になります。\0
は NUL 文字の文字エスケープです。
大文字と小文字を区別しない照合では、後方参照は元のテキストと異なる大文字と小文字を持つテキストと一致することがあります。
/(b)\1/i.test("bB"); // true
後方参照は存在するキャプチャグループを参照しなければなりません。指定する数がキャプチャグループの総数より大きい場合、構文エラーが発生します。
/(a)\2/u; // SyntaxError: Invalid regular expression: Invalid escape
Unicode 対応モードでない場合は、無効な後方参照は古い 8 進エスケープシーケンスになります。これはウェブの互換性のために非推奨の構文ですので、頼ってはいけません。
/(a)\2/.test("a\x02"); // true
参照するキャプチャグループが一致しない場合(例えば、それが論理和の一致しない選択肢に属するため)、または、グループがまだ一致 していない場合(例えば、それが後方参照の正しい位置にあるため)、後方参照は常に成功します(空文字列に一致するかのように)。
/(?:a|(b))\1c/.test("ac"); // true
/\1(a)/.test("a"); // true
例
引用符のペアリング
以下の関数は、文字列中の title='xxx'
と title="xxx"
のパターンに一致します。引用符が確実に一致するように、後方参照を使用して最初の引用符を参照します。2 つ目のキャプチャグループ ([2]
) にアクセスすると、一致する引用符の間の文字列を返します。
function parseTitle(metastring) {
return metastring.match(/title=(["'])(.*?)\1/)[2];
}
parseTitle('title="foo"'); // 'foo'
parseTitle("title='foo' lang='en'"); // 'foo'
parseTitle('title="Named capturing groups\' advantages"'); // "Named capturing groups' advantages"
重複する単語の照合
以下の関数は、文字列中の重複する単語(通常はタイプミス)を探します。なお、\w
文字クラスエスケープ は英字にのみ一致しますが、アクセント付きの文字や他のアルファベットには一致しません。より一般的な照合を行いたい場合は、文字列を空白で分割し、結果の配列を反復処理するとよいでしょう。
function findDuplicates(text) {
return text.match(/\b(\w+)\s+\1\b/i)?.[1];
}
findDuplicates("foo foo bar"); // 'foo'
findDuplicates("foo bar foo"); // undefined
findDuplicates("Hello hello"); // 'Hello'
findDuplicates("Hello hellos"); // undefined
仕様書
Specification |
---|
ECMAScript Language Specification # prod-DecimalEscape |
ブラウザーの互換性
BCD tables only load in the browser