概要:このチュートリアルでは、JavaScript正規表現のキャプチャグループについて学び、それを使用して一致に対するサブグループを作成する方法を説明します。
JavaScript正規表現のキャプチャグループ入門
次のパスがあるとします。
resource/id
Code language: JavaScript (javascript)
例えば
posts/10
このパスでは、リソースはposts
で、id
は10です。パスに一致させるには、次の正規表現を使用します。
/\w+\/\d+/
Code language: JavaScript (javascript)
このパターンでは
\w+
は、文字クラスと量子化子(+)の組み合わせで、1文字以上の単語文字に一致します。/
はスラッシュ(/
)に一致します。バックスラッシュ(\
)はスラッシュをエスケープします。\d+
は、数字文字クラスと量子化子(+
)の組み合わせで、1桁以上の数字に一致します。
次の例では、正規表現/\w+\/\d+/
パターンを使用して文字列 'posts/10'
に一致します。
const path = 'posts/10';
const pattern = /\w+\/\d+/;
const match = path.match(pattern);
console.log(match);
Code language: JavaScript (javascript)
出力
[ 'posts/10', index: 0, input: 'posts/10', groups: undefined ]
Code language: JavaScript (javascript)
パスposts/10
からid 10を取得するには、キャプチャグループを使用します。ルールにキャプチャグループを作成するには、そのルールを括弧で囲みます。
(rule)
Code language: JavaScript (javascript)
次の例では、パスposts/10
からid
値をキャプチャするキャプチャグループを作成します。
'\w+/(\d+)'
Code language: JavaScript (javascript)
このパターンでは、ルール\d+
を括弧()
で囲んでいます。新しいパターンでプログラムを実行すると、1つのマッチが表示されます。
const path = 'posts/10';
const pattern = /\w+\/(\d+)/;
const match = path.match(pattern);
console.log(match);
Code language: JavaScript (javascript)
出力
[ 'posts/10', '10', index: 0, input: 'posts/10', groups: undefined ]
Code language: JavaScript (javascript)
match()
メソッドは、一致の配列を返します。最初の要素は完全一致('posts/10'
)で、2番目の要素('10'
)はキャプチャグループの値です。
String.match()
メソッドは、g
フラグ(例:/\w+\/(\d+)/g
)を設定した場合、グループを返しません。g
フラグを使用する場合は、グループを取得するためにString.matchAll()
メソッドを使用する必要があります。
複数のキャプチャグループ
パス(post/10
)のリソース(posts
)とid(10
)の両方をキャプチャするには、正規表現に複数のキャプチャグループを次のように使用します。
/(\w+)\/(\d+)/
Code language: JavaScript (javascript)
この正規表現には、\w+
と\d+
の2つのキャプチャグループがあります。
次のスクリプトは、完全一致とすべてのサブグループを示しています。
const path = 'posts/10';
const pattern = /(\w+)\/(\d+)/;
const match = path.match(pattern);
console.log(match);
Code language: JavaScript (javascript)
出力
['posts/10', 'posts', '10', index: 0, input: 'posts/10', groups: undefined]
Code language: JavaScript (javascript)
最初のサブグループと2番目のサブグループにアクセスするには、match[1]
とmatch[2]
を使用します。match[0]
は完全一致を返します。例:
const path = 'posts/10';
const pattern = /(\w+)\/(\d+)/;
const match = path.match(pattern);
console.log(match[0], match[1], match[2]);
Code language: JavaScript (javascript)
出力
posts/10 posts 10
Code language: JavaScript (javascript)
名前付きキャプチャグループ
一致内のサブグループにアクセスするには、インデックスを使用します。しかし、より便利にするために、意味のある名前でサブグループにアクセスしたい場合があります。
そのためには、**名前付きキャプチャグループ**を使用して、グループに名前を割り当てます。次の例は、グループに名前を割り当てる構文を示しています。
(?<name>rule)
Code language: JavaScript (javascript)
この構文では
()
はキャプチャグループを示します。?<name>
はキャプチャグループの名前を指定します。rule
はパターン内のルールです。
例えば、次のように名前を作成します。
/?<resource>\w+)\/(?<id>\d+/
Code language: JavaScript (javascript)
この構文では
resource
は最初のキャプチャグループの名前です。id
は2番目のキャプチャグループの名前です。
例えば
const path = 'posts/10';
const pattern = /(?<resource>\w+)\/(?<id>\d+)/;
const match = path.match(pattern);
console.log(match);
Code language: JavaScript (javascript)
出力
[
'posts/10',
'posts',
'10',
index: 0,
input: 'posts/10',
groups: [Object: null prototype] { resource: 'posts', id: '10' }
]
Code language: JavaScript (javascript)
一致には、オブジェクトであるgroups
プロパティがあります。match.groups
オブジェクトには、名前がキャプチャグループ名で、値がキャプチャ値であるプロパティがあります。例:
const path = 'posts/10';
const pattern = /(?<resource>\w+)\/(?<id>\d+)/;
const match = path.match(pattern);
for (const name in match.groups) {
console.log(name, match.groups[name]);
}
Code language: JavaScript (javascript)
出力
resource posts
id 10
Code language: JavaScript (javascript)
名前付きキャプチャグループの追加例
次の正規表現は、パスposts/2022/02/18
に一致します。
/\w+\/d{4}\/d{2}\/d{2}/
Code language: JavaScript (javascript)
リソース(post)、年(2022)、月(02)、日(18)をキャプチャするには、次のように名前付きキャプチャグループを使用します。
/(?<resource>\w+)\/(?<year>\d{4})\/(?<month>\d{2})\/(?<day>\d{2})/
Code language: JavaScript (javascript)
このプログラムは、パターンを使用してパスに一致し、すべてのサブグループを表示します。
const path = 'posts/2022/02/18';
const pattern =
/(?<resource>\w+)\/(?<year>\d{4})\/(?<month>\d{2})\/(?<day>\d{2})/;
const match = path.match(pattern);
console.log(match.groups);
Code language: JavaScript (javascript)
出力
{resource: 'posts', year: '2022', month: '02', day: '18'}
Code language: JavaScript (javascript)
まとめ
- ルールを括弧
()
で囲んでキャプチャグループを作成します。正規表現には複数のキャプチャグループを含めることができます。 (?<capturingGroupName>rule)
を使用して、パターン内のルールに対して名前付きキャプチャグループを作成します。