JavaScript. Подробное руководство, 6-е издание, стр. 143

Метод

<b>replace()</b>
представляет собой более мощное средство, чем можно было бы предположить по этому примеру. Напомню, что подвыражения в скобках, находящиеся внутри регулярного выражения, нумеруются слева направо, и что регулярное выражение запоминает текст, соответствующий каждому из подвыражений. Если в строке замены присутствует знак
<b>$</b>
с цифрой, метод
<b>replace()</b>
заменяет эти два символа текстом, соответствующим указанному подвыражению. Это очень полезная возможность. Мы можем использовать ее, например, для замены прямых кавычек в строке типографскими кавычками, которые имитируются ASCII-символами:

<b>// Цитата - это кавычка, за которой следует любое число символов, отличных от кавычек</b>

<b>// (их мы запоминаем), за этими символами следует еще одна кавычка,</b>

<b>var quote = /'([~&quot;]*/g;</b>

<b>// Заменяем прямые кавычки типографскими и оставляем без изменений</b>

<b>// содержимое цитаты, хранящееся в $1.</b>

<b>text. replace(quote, &quot;«$1»&quot;);</b>

Метод

<b>replace()</b>
предоставляет и другие ценные возможности, о которых рассказывается в третьей части книги, в справке к методу
<b>String.replace().</b>
Самое важное, что следует отметить, - второй аргумент
<b>replace()</b>
может быть функцией, динамически вычисляющей строку замены.

Метод

<b>match()</b>
- это наиболее общий из методов класса
<b>String</b>
, использующих регулярные выражения. Он принимает в качестве единственного аргумента регулярное выражение (или преобразует свой аргумент в регулярное выражение, передав его конструктору
<b>RegExp()</b>
) и возвращает массив, содержащий результаты поиска. Если в регулярном выражении установлен флаг g, метод возвращает массив всех соответствий, присутствующих в строке. Например:

<b>&quot;1 плюс 2 равно 3&quot;.match(/\d+/g) // вернет [&quot;1&quot;, &quot;2&quot;, &quot;3&quot;]</b>

Если регулярное выражение не содержит флаг

<b>g</b>
, метод
<b>match()</b>
не выполняет глобальный поиск; он просто ищет первое совпадение. Однако
<b>match()</b>
возвращает массив, даже когда метод не выполняет глобальный поиск. В этом случае первый элемент массива - это найденная подстрока, а все оставшиеся элементы представляют собой подвыражения регулярного выражения. Поэтому если
<b>match()</b>
возвращает массив а, то а[0] будет содержать найденную строку целиком, а[1] -подстроку, соответствующую первому подвыражению, и т. д. Проводя параллель с методом
<b>replace(),</b>
можно сказать, что в а[n] заносится содержимое $n.

Например, взгляните на следующий программный код, выполняющий разбор URL-адреса:

<b>var url = /(\w+):\/\/([\w.]+)\/(\S*)/;</b>

<b>var text = &quot;Посетите мою домашнюю страницу </b><a href="http://www.exarnple.com/%22david"><b>http://www.exarnple.com/&quot;david</b></a><b>&quot;;</b>

<b>var result = text.match(url);</b>

<b>if (result != null) {</b>

<b>  var fullurl = result[0]; // Содержит &quot;</b><a href="http://www.example.com/%22david"><b>http://www.example.com/&quot;david</b></a><b>&quot;</b>

<b>  var protocol = result[1]; // Содержит &quot;http&quot;</b>

<b>  var host = result[2]; // Содержит &quot;</b><a href="http://www.example.com/"><b>www.example.com</b></a><b>&quot;</b>

<b>  var path = result[3]; // Содержит &quot;david&quot;</b>

<b>}</b>

Следует отметить, что для регулярного выражения, в котором не установлен флаг

<b>g</b>
глобального поиска, метод
<b>match()</b>
возвращает то же значение, что и метод
<b>ехес()</b>
регулярного выражения: возвращаемый массив имеет свойства
<b>index</b>
и
<b>input</b>
, как описывается в обсуждении метода
<b>ехес()</b>
ниже.

Последний из методов объекта

<b>String</b>
, в котором используются регулярные выражения, -
<b>split().</b>
Этот метод разбивает строку, для которой он вызван, на массив подстрок, используя аргумент в качестве разделителя. Например:

<b>&quot;123,456,789&quot;.split(&quot;,&quot;); // Вернет [&quot;123&quot;,&quot;456&quot;,&quot;789&quot;]</b>

Метод

<b>split()</b>
может также принимать в качестве аргумента регулярное выражение. Это делает метод более мощным. Например, можно указать разделитель, допускающий произвольное число пробельных символов с обеих сторон:

<b>&quot;1, 2, 3 , 4 , 5&quot;.split(/\s*,\s*/); // Вернет [&quot;1&quot;,&quot;2&quot;,&quot;З&quot;,&quot;4&quot;,&quot;5&quot;]</b>

Метод

<b>split()</b>
имеет и другие возможности. Полное описание приведено в третьей части книги при описании метода
<b>String. split().</b>

10.3. Объект RegExp

Как было упомянуто в начале этой главы, регулярные выражения представлены в виде объектов

<b>RegExp</b>
. Помимо конструктора
<b>RegExp(),</b>
объекты
<b>RegExp</b>
поддерживают три метода и несколько свойств. Методы поиска и свойства класса
<b>RegExp</b>
описаны в следующих двух подразделах.