Files
2022-01-20 20:30:18 +01:00

116 lines
3.5 KiB
Markdown

---
id: 587d7dbb367417b2b2512baa
title: キャプチャグループを使用してパターンを再利用する
challengeType: 1
forumTopicId: 301364
dashedName: reuse-patterns-using-capture-groups
---
# --description--
次のように複数回出現する単語にマッチさせたいとします。
```js
let repeatStr = "row row row your boat";
```
`/row row row/` を使用することもできますが、繰り返される具体的な言葉がわからない場合はどうしますか? <dfn>キャプチャグループ</dfn>を使用すると、繰り返される部分文字列を見つけることができます。
キャプチャグループは、キャプチャする正規表現パターンを丸括弧で囲んで構成します。 この例では、英数字で構成される単語をキャプチャすることが目的なので、キャプチャグループは `\w+` を丸括弧で囲んだ `/(\w+)/` になります。
グループにマッチした部分文字列は一時的な「変数」に保存されます。 これには同じ正規表現の中で、バックスラッシュ (または円記号) とキャプチャグループの番号を使用してアクセスできます (例: `\1`)。 キャプチャグループは、開始括弧の位置に応じて (左から右の順で) 自動的に 1 から番号付けされます。
次の例は、スペースで 3 つに区切られた単語にマッチします。
```js
let repeatRegex = /(\w+) \1 \1/;
repeatRegex.test(repeatStr); // Returns true
repeatStr.match(repeatRegex); // Returns ["row row row", "row"]
```
文字列に `.match()` メソッドを使用すると、キャプチャグループとともに、一致した部分文字列を持つ配列が返されます。
# --instructions--
`reRegex` でキャプチャグループを使用して、単一のスペースで区切られ、同じ数字のみが正確に 3 回繰り返される構成の文字列にマッチさせてください。
# --hints--
正規表現で数字の略記文字クラスを使用する必要があります。
```js
assert(reRegex.source.match(/\\d/));
```
正規表現でキャプチャグループを 2 回再利用する必要があります。
```js
assert(reRegex.source.match(/\\1|\\2/g).length >= 2);
```
正規表現は文字列 `42 42 42` にマッチする必要があります。
```js
reRegex.lastIndex = 0;
assert(reRegex.test('42 42 42'));
```
正規表現は文字列 `100 100 100` にマッチする必要があります。
```js
reRegex.lastIndex = 0;
assert(reRegex.test('100 100 100'));
```
正規表現は文字列 `42 42 42 42` にマッチしない必要があります。
```js
assert.equal('42 42 42 42'.match(reRegex.source), null);
```
正規表現は文字列 `42 42` にマッチしない必要があります。
```js
assert.equal('42 42'.match(reRegex.source), null);
```
正規表現は文字列 `101 102 103` にマッチしない必要があります。
```js
reRegex.lastIndex = 0;
assert(!reRegex.test('101 102 103'));
```
正規表現は文字列 `1 2 3` にマッチしない必要があります。
```js
reRegex.lastIndex = 0;
assert(!reRegex.test('1 2 3'));
```
正規表現は文字列 `10 10 10` にマッチする必要があります。
```js
reRegex.lastIndex = 0;
assert(reRegex.test('10 10 10'));
```
# --seed--
## --seed-contents--
```js
let repeatNum = "42 42 42";
let reRegex = /change/; // Change this line
let result = reRegex.test(repeatNum);
```
# --solutions--
```js
let repeatNum = "42 42 42";
let reRegex = /^(\d+)\s\1\s\1$/;
let result = reRegex.test(repeatNum);
```