aboutsummaryrefslogtreecommitdiff
path: root/files/ru/web/javascript/reference/global_objects/regexp/exec/index.html
blob: fdd7c920410a8dcd773b06f076ecdf98bed03cb9 (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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
---
title: RegExp.prototype.exec()
slug: Web/JavaScript/Reference/Global_Objects/RegExp/exec
tags:
  - JavaScript
  - Method
  - Prototype
  - Reference
  - RegExp
  - регулярные выражения
translation_of: Web/JavaScript/Reference/Global_Objects/RegExp/exec
---
<div>{{JSRef("Global_Objects", "RegExp")}}</div>

<h2 id="Summary" name="Summary">Сводка</h2>

<p>Метод <strong><code>exec()</code></strong> выполняет поиск сопоставления регулярного выражения в указанной строке. Возвращает массив с результатами или {{jsxref("null")}}.</p>

<p>Если целью выполнения является просто определить, проходит оно или нет, используйте метод {{jsxref("RegExp.prototype.test()")}}, либо метод строки {{jsxref("String.prototype.search()")}}.</p>

<h2 id="Syntax" name="Syntax">Синтаксис</h2>

<pre class="syntaxbox"><code><var>regexObj</var>.exec(<var>str</var>)</code></pre>

<h3 id="Parameters" name="Parameters">Параметры</h3>

<dl>
 <dt><code>str</code></dt>
 <dd>Строка, с которой производится сопоставление регулярного выражения.</dd>
</dl>

<h3 id="Returns" name="Returns">Возвращаемое значение</h3>

<p>Если сопоставление успешно выполнилось, метод <code>exec()</code> возвращает массив и обновляет свойства объекта регулярного выражения. Возвращаемый массив в первом элементе содержит сопоставленный текст, а в последующих элементах — текст, захваченный при сопоставлении круглыми скобками.</p>

<p>Если сопоставление не удалось, метод <code>exec()</code> возвращает {{jsxref("null")}}.</p>

<h2 id="Description" name="Description">Описание</h2>

<p>Рассмотрим следующий пример:</p>

<pre class="brush: js">// Сопоставляется с фразой «кайф, сплющь», за которой следует слово «вши»,
// игнорируя любые символы между ними. Запоминает слова «сплющь» и «вши».
// Игнорирует регистр символов.
var re = /кайф,\s(сплющь).+?(вши)/ig;
var result = re.exec('Эх, чужд кайф, сплющь объём вши, грызя цент.');
</pre>

<p>Таблица ниже показывает результаты выполнения данного примера:</p>

<table class="fullwidth-table">
 <tbody>
  <tr>
   <td class="header">Объект</td>
   <td class="header">Свойство/Индекс</td>
   <td class="header">Описание</td>
   <td class="header">Пример</td>
  </tr>
  <tr>
   <td rowspan="4"><code>result</code></td>
   <td><code>[0]</code></td>
   <td>Все сопоставившиеся символы в строке.</td>
   <td><code>кайф, сплющь объём вши</code></td>
  </tr>
  <tr>
   <td><code>[1], ...[<em>n</em>]</code></td>
   <td>Сопоставившиеся подстроки в круглых скобках, если они присутствуют. Количество возможных подстрок ничем не ограничено.</td>
   <td><code>[1] = сплющь<br>
    [2] = вши</code></td>
  </tr>
  <tr>
   <td><code>index</code></td>
   <td>Индекс сопоставления в строке, начинается с нуля.</td>
   <td><code>9</code></td>
  </tr>
  <tr>
   <td><code>input</code></td>
   <td>Оригинальная строка.</td>
   <td><code>Эх, чужд кайф, сплющь объём вши, грызя цент.</code></td>
  </tr>
  <tr>
   <td rowspan="5"><code>re</code></td>
   <td><code>lastIndex</code></td>
   <td>Индекс, с которого начнётся следующая попытка сопоставления. Если отсутствует флаг <code>"g"</code>, остаётся равным нулю.</td>
   <td><code>31</code></td>
  </tr>
  <tr>
   <td><code>ignoreCase</code></td>
   <td>Указывает, что в регулярном выражении используется флаг игнорирования регистра <code>"i"</code>.</td>
   <td><code>true</code></td>
  </tr>
  <tr>
   <td><code>global</code></td>
   <td>Указывает, что в регулярном выражении используется флаг глобального сопоставления <code>"g"</code>.</td>
   <td><code>true</code></td>
  </tr>
  <tr>
   <td><code>multiline</code></td>
   <td>Указывает, что в регулярном выражении используется флаг сопоставления по нескольким строкам <code>"m"</code>.</td>
   <td><code>false</code></td>
  </tr>
  <tr>
   <td><code>source</code></td>
   <td>Текст шаблона регулярного выражения.</td>
   <td><code>кайф,\s(сплющь).+?(вши)</code></td>
  </tr>
 </tbody>
</table>

<h2 id="Examples" name="Examples">Примеры</h2>

<h3 id="Example:_Finding_successive_matches" name="Example:_Finding_successive_matches">Пример: поиск последовательных сопоставлений</h3>

<p>Если ваше регулярное выражение использует флаг <code>"g"</code>, вы можете использовать метод <code>exec()</code> несколько раз для нахождения последовательных сопоставлений в одной и той же строке. Если вы сделаете это, поиск начнётся по подстроке строки <code>str</code>, начало которой определяется свойством {{jsxref("RegExp.lastIndex", "lastIndex")}} регулярного выражения (метод {{jsxref("RegExp.prototype.test()", "test()")}} также увеличивает свойство {{jsxref("RegExp.lastIndex", "lastIndex")}}). Например, предположим, что у вас есть следующий скрипт:</p>

<pre class="brush: js">var myRe = /аб*/g;
var str = 'аббвгдеабж';
var myArray;
while ((myArray = myRe.exec(str)) !== null) {
  var msg = 'Найдено ' + myArray[0] + '. ';
  msg += 'Следующее сопоставление начнётся с позиции ' + myRe.lastIndex;
  console.log(msg);
}
</pre>

<p>Этот скрипт выведет следующий текст:</p>

<pre class="brush: js">Найдено абб. Следующее сопоставление начнётся с позиции 3
Найдено аб. Следующее сопоставление начнётся с позиции 9
</pre>

<p>Примечание: не помещайте литерал регулярного выражения (или конструктор {{jsxref("RegExp")}}) внутрь условия <code>while</code>; это приведёт к бесконечному циклу, поскольку свойство {{jsxref("RegExp.lastIndex", "lastIndex")}} будет сбрасываться в ноль на каждой итерации цикла. Также убедитесь, что установлен флаг глобального сопоставления, в противном случае цикл будет бесконечным.</p>

<h3 id="Example:_Using_exec_with_RegExp_literals" name="Example:_Using_exec_with_RegExp_literals">Пример: использование метода <code>exec()</code> вместе с литералами регулярного выражения</h3>

<p>Вы можете использовать метод <code>exec()</code> без создания объекта {{jsxref("RegExp")}}:</p>

<pre class="brush: js">var matches = /(привет \S+)/.exec('Это привет миру!');
console.log(matches[1]);
</pre>

<p>Скрипт выведет в журнал строку «привет миру!».</p>

<h2 id="Specifications" name="Specifications">Спецификации</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Спецификация</th>
   <th scope="col">Статус</th>
   <th scope="col">Комментарии</th>
  </tr>
  <tr>
   <td>ECMAScript 3-е издание.</td>
   <td>Стандарт</td>
   <td>Изначальное определение. Реализована в JavaScript 1.2.</td>
  </tr>
  <tr>
   <td>{{SpecName('ES5.1', '#sec-15.10.6.21', 'RegExp.exec')}}</td>
   <td>{{Spec2('ES5.1')}}</td>
   <td> </td>
  </tr>
  <tr>
   <td>{{SpecName('ES6', '#sec-regexp.prototype.exec', 'RegExp.exec')}}</td>
   <td>{{Spec2('ES6')}}</td>
   <td> </td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility" name="Browser_compatibility">Совместимость с браузерами</h2>

<div>{{CompatibilityTable}}</div>

<div id="compat-desktop">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Возможность</th>
   <th>Chrome</th>
   <th>Firefox (Gecko)</th>
   <th>Internet Explorer</th>
   <th>Opera</th>
   <th>Safari</th>
  </tr>
  <tr>
   <td>Базовая поддержка</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>

<div id="compat-mobile">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Возможность</th>
   <th>Android</th>
   <th>Chrome для Android</th>
   <th>Firefox Mobile (Gecko)</th>
   <th>IE Mobile</th>
   <th>Opera Mobile</th>
   <th>Safari Mobile</th>
  </tr>
  <tr>
   <td>Базовая поддержка</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>

<h2 id="See_also" name="See_also">Смотрите также</h2>

<ul>
 <li>Глава про <a href="/ru/docs/Web/JavaScript/Guide/Regular_Expressions">регулярные выражения</a> в <a href="/ru/docs/Web/JavaScript/Guide">руководстве по JavaScript</a></li>
 <li>{{jsxref("RegExp")}}</li>
</ul>