正規表現のバックスラッシュの数字(\1)とは何か

正規表現を書いていると、たまーに「\1」と言う書き方をしている表現を見かけます。

今回は、この\1とか\2の正規表現に関して解説していきます。

バックスラッシュ+数字ってどんな意味なの?

結論から言うと、バックスラッシュ+数字の正規表現は、「マッチした正規表現の代入」です。この説明だけだと分かりにくいので、簡単な例を以下に示します。

下記のコードは、JavaScriptで書かれたものです。

var regex = /(abc) (\1de)/;
var str = "abc abcde";

var result = regex.exec(str);
console.log(result);

重要なのは、1行目の/(abc) (\1de)/;と書かれている部分で、 \1と書くことで「1番目に正規表現にマッチした部分を代入すること」ができるのです。

先ほどのコードの場合は、まず(abc)の部分でマッチしています。つまり、この(abc)が1番目にマッチしたもので、その後に \1 と書くことで\1の部分に abc を代入しているわけですね。

つまり、以下の2種類の正規表現の書き方は全く同じものと言えます。

var regex = /(abc) (\1de)/;
var regex = /(abc) (abcde)/;

ちなみに、\2と書けば2番目にマッチしたもの、\3と書けば3番目にマッチしたものを代入できます。

要は、正規表現の結果で使われる$1とか$2みたいなものですね。

実際のバックスラッシュ+数字の使われ方

では、具体的に「バックスラッシュ+数字」はどのように使われるかと言うと、「すでにマッチした文字列と全く同じ条件を使いまわしたい」と言う場合に有効です。

例えば、Markdownライブラリとして有名な「 marked/marked.js at master · markedjs/marked 」には、以下の様なコードが書かれています。(一部変えています)

block.item = /^( *)(+|-|*) ?[^\n]*(?:\n(?!\1[+|-|*] ?)[^\n]*)*/;

上記のコードでは、正規表現で1番目にマッチする文字列として「( *)」0文字以上のスペースを使っています。

この場合、0文字以上のスペースにマッチするので、ユーザーの書き方によってはスペース2文字でマッチする時もあれば、5文字でマッチする時もあります。

そして、1番目の ( *) と全く同じようにマッチしてほしい部分がある、と言う時もあります。例えば、「1番目の ( *) がスペース3つでマッチしたら、ここの部分もスペース3つでマッチしてほしい」と言う場合です。

そのようなケースの場合は、\1を使う事で表現できます。

参考: regex – What’s the meaning of a number after a backslash in a regular expression? – Stack Overflow

ReratedPosts

正規表現におけるドット(.)の使い方や注意点を解説する