aboutsummaryrefslogtreecommitdiff
path: root/files/ja/web/javascript/guide/regular_expressions/groups_and_ranges/index.html
blob: d79009b14e3665f7908cf4c96f49eca070594792 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
---
title: グループと範囲
slug: Web/JavaScript/Guide/Regular_Expressions/Groups_and_Ranges
tags:
  - Guide
  - JavaScript
  - Reference
  - Regular Expressions
  - regex
translation_of: Web/JavaScript/Guide/Regular_Expressions/Groups_and_Ranges
---
<p>{{jsSidebar("JavaScript Guide")}}{{draft}}</p>

<p>グループと範囲は、式にある文字のグループと範囲を示します。</p>

<h2 id="Types" name="Types">種類</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">文字</th>
   <th scope="col">意味</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><code><em>x</em>|<em>y</em></code></td>
   <td>
    <p>"x" または "y" にマッチします。例えば <code>/green|red/</code> は "green apple" の "green" や "red apple" の "red" にマッチします。</p>
   </td>
  </tr>
  <tr>
   <td><code>[xyz]<br>
    [a-c]</code></td>
   <td>
    <p>文字集合です。角括弧で囲まれた文字のいずれか 1 個にマッチします。ハイフンを用いて文字の範囲を指定することも可能ですが、ハイフンが括弧に囲まれた最初または最後の文字に現れている場合、それはハイフンリテラルとみなされて、通常文字として文字集合に含まれます。文字集合には文字クラスを含めることができます。</p>

    <p>例えば <code>[abcd]</code><code>[a-d]</code> と同じです。これは "brisket" の "b" や "chop" の "c" にマッチします。</p>

    <p>例えば、<code>[abcd-]</code><code>[-abcd]</code> は "brisket" の "b" と "chop" の "c" と "non-profit" の "-" (ハイフン)とマッチします。</p>

    <p>例えば、<code>[\w-]</code><code>[A-Za-z0-9_-]</code> と同じです。これは "brisket" の "b" や "chop" の "c" 、"non-profit" の "n" にマッチします。</p>
   </td>
  </tr>
  <tr>
   <td>
    <p><code>[^xyz]<br>
     [^a-c]</code></p>
   </td>
   <td>
    <p>文字集合の否定または補集合です。角括弧で囲まれた文字ではない文字にマッチします。ハイフンを用いて文字の範囲を指定することも可能ですが、ハイフンが括弧に囲まれた最初または最後の文字に現れている場合、それはハイフンリテラルとみなされて、通常文字として文字集合に含まれます。例えば <code>[^abc]</code><code>[^a-c]</code> と同じです。これは "bacon" の 'o' や "chop" の 'h' にマッチします。</p>

    <div class="blockIndicator note">
    <p>^ 文字は<a href="/ja/docs/Web/JavaScript/Guide/Regular_Expressions/Boundaries">入力の先頭</a>を示すこともできます。</p>
    </div>
   </td>
  </tr>
  <tr>
   <td><code>(<em>x</em>)</code></td>
   <td>
    <p><strong>キャプチャグループ:</strong> <code><em>x</em></code> にマッチし、マッチした内容を記憶します。例えば <code>/(foo)/</code> は "foo bar" の "foo" にマッチし、記憶します。</p>

    <p>正規表現は複数のキャプチャグループを持つことができます。結果、一般的にキャプチャグループ内の左括弧と同じ順にある、配列の要素のキャプチャグループに一致しています。たいていの場合、これはキャプチャグループ自身の順番です。これはキャプチャグループがネストしている場合に重要です。マッチは結果の要素のインデックス (<code>[1], ..., [n]</code>) や、あらかじめ定義されている <code>RegExp</code> オブジェクトのプロパティ (<code>$1, ..., $9</code>) を使ってアクセスできます。</p>

    <p>キャプチャグループはパフォーマンスペナルティがあります。マッチした部分文字列を使わない場合はキャプチャしない括弧(後述)を使ったほうがいいでしょう。</p>

    <p>全体マッチ (<code>/.../g</code>) がある場合、{{JSxRef("String.match()")}} はグループを返せません。ですが、 {{JSxRef("String.matchAll()")}} によってすべてのマッチを取得できます。</p>
   </td>
  </tr>
  <tr>
   <td><code>\<em>n</em></code></td>
   <td>
    <p><code><em>n</em></code> に正の整数が入ります。正規表現内において n 番目の括弧の部分にマッチした最新の部分文字列への後方参照となります(括弧の数は左からカウントします)。例えば <code>/apple(,)\sorange\1/</code> は "apple, orange, cherry, peach" の "apple, orange," にマッチします。A complete example follows this table.</p>
   </td>
  </tr>
  <tr>
   <td><code>(?&lt;Name&gt;x)</code></td>
   <td>
    <p><strong>名前付きキャプチャグループ:</strong> <code>x</code> にマッチし、<code>&lt;Name&gt;</code> で指定された名前に従い、返されるマッチの <code>groups</code> プロパティに記憶されます。三角括弧 ('<code>&lt;</code>' と '<code>&gt;</code>') にはグループ名が必須です。</p>

    <p>例えば、電話番号からアメリカのエリアコードを取り出す際、<code>/\((?&lt;area&gt;\d\d\d)\)/</code> を使うことができます。 結果の番号は <code>matches.groups.area</code> に表示されます。</p>
   </td>
  </tr>
  <tr>
   <td><code>(?:<em>x</em>)</code></td>
   <td>
    <p><strong>非キャプチャグループ:</strong> <em><code>x</code></em> にマッチしますが、マッチした内容は記憶しません。マッチの部分文字列は、結果の配列の要素 (<code>[1], ..., [n]</code>) や、あらかじめ定義されている <code>RegExp</code> オブジェクトのプロパティ (<code>$1, ..., $9</code>) から呼び出すことはできません。.</p>
   </td>
  </tr>
 </tbody>
</table>

<h2 id="Examples" name="Examples"></h2>

<h3 id="母音を数える">母音を数える</h3>

<pre class="brush: js">var aliceExcerpt = "There was a long silence after this, and Alice could only hear whispers now and then.";
var regexpVowels = /[aeiouy]/g;

console.log("母音の数:", aliceExcerpt.match(regexpVowels).length);
// 母音の数: 25</pre>

<h3 id="グループの使い方">グループの使い方</h3>

<pre class="brush: js">let personList = `First_Name: John, Last_Name: Doe
First_Name: Jane, Last_Name: Smith`;

let regexpNames =  /First_Name: (\w+), Last_Name: (\w+)/mg;
let match = regexpNames.exec(personList);
do {
  console.log(`Hello ${match[1]} ${match[2]}`);
} while((match = regexpNames.exec(personList)) !== null);
</pre>

<h3 id="名前付きグループの使い方">名前付きグループの使い方</h3>

<pre class="brush: js">let personList = `First_Name: John, Last_Name: Doe
First_Name: Jane, Last_Name: Smith`;

let regexpNames =  /First_Name: (?&lt;firstname&gt;\w+), Last_Name: (?&lt;lastname&gt;\w+)/mg;
let match = regexpNames.exec(personList);
do {
  console.log(`Hello ${match.groups.firstname} ${match.groups.lastname}`);
} while((match = regexpNames.exec(personList)) !== null);</pre>

<div class="blockIndicator note">
<p><strong>注:</strong> すべてのブラウザがこの機能をサポートしているわけではありません。以下の互換性の表を参照してください。</p>
</div>

<h2 id="仕様">仕様</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">仕様</th>
   <th scope="col">策定状況</th>
   <th scope="col">コメント</th>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-classranges', 'RegExp: Ranges')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td></td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_support" name="Browser_support">ブラウザサポート</h2>

<div>


<div class="hidden">Firefox currently doesn't support named groups. See <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1362154">corresponding issue</a>. — make sure to include this inside groups_ranges</div>

<p>{{Compat("javascript.builtins.RegExp.groups_ranges")}}</p>
</div>

<h2 id="See_also" name="See_also">関連情報</h2>

<ul>
 <li><a href="/ja/docs/Web/JavaScript/Guide/Regular_Expressions">正規表現</a></li>
 <li><a href="/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp"><code>RegExp()</code> コンストラクタ</a></li>
</ul>