Метод
<b>replace()</b>
представляет собой более мощное средство, чем можно было бы предположить по этому примеру. Напомню, что подвыражения в скобках, находящиеся внутри регулярного выражения, нумеруются слева направо, и что регулярное выражение запоминает текст, соответствующий каждому из подвыражений. Если в строке замены присутствует знак
<b>$</b>
с цифрой, метод
<b>replace()</b>
заменяет эти два символа текстом, соответствующим указанному подвыражению. Это очень полезная возможность. Мы можем использовать ее, например, для замены прямых кавычек в строке типографскими кавычками, которые имитируются ASCII-символами:
<b>// Цитата - это кавычка, за которой следует любое число символов, отличных от кавычек</b>
<b>// (их мы запоминаем), за этими символами следует еще одна кавычка,</b>
<b>var quote = /'([~"]*/g;</b>
<b>// Заменяем прямые кавычки типографскими и оставляем без изменений</b>
<b>// содержимое цитаты, хранящееся в $1.</b>
<b>text. replace(quote, "«$1»");</b>
Метод
<b>replace()</b>
предоставляет и другие ценные возможности, о которых рассказывается в третьей части книги, в справке к методу
<b>String.replace().</b>
Самое важное, что следует отметить, - второй аргумент
<b>replace()</b>
может быть функцией, динамически вычисляющей строку замены.
Метод
<b>match()</b>
- это наиболее общий из методов класса
<b>String</b>
, использующих регулярные выражения. Он принимает в качестве единственного аргумента регулярное выражение (или преобразует свой аргумент в регулярное выражение, передав его конструктору
<b>RegExp()</b>
) и возвращает массив, содержащий результаты поиска. Если в регулярном выражении установлен флаг g, метод возвращает массив всех соответствий, присутствующих в строке. Например:
<b>"1 плюс 2 равно 3".match(/\d+/g) // вернет ["1", "2", "3"]</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 = "Посетите мою домашнюю страницу </b><a href="http://www.exarnple.com/%22david"><b>http://www.exarnple.com/"david</b></a><b>";</b>
<b>var result = text.match(url);</b>
<b>if (result != null) {</b>
<b> var fullurl = result[0]; // Содержит "</b><a href="http://www.example.com/%22david"><b>http://www.example.com/"david</b></a><b>"</b>
<b> var protocol = result[1]; // Содержит "http"</b>
<b> var host = result[2]; // Содержит "</b><a href="http://www.example.com/"><b>www.example.com</b></a><b>"</b>
<b> var path = result[3]; // Содержит "david"</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>"123,456,789".split(","); // Вернет ["123","456","789"]</b>
Метод
<b>split()</b>
может также принимать в качестве аргумента регулярное выражение. Это делает метод более мощным. Например, можно указать разделитель, допускающий произвольное число пробельных символов с обеих сторон:
<b>"1, 2, 3 , 4 , 5".split(/\s*,\s*/); // Вернет ["1","2","З","4","5"]</b>
Метод
<b>split()</b>
имеет и другие возможности. Полное описание приведено в третьей части книги при описании метода
<b>String. split().</b>
10.3. Объект RegExp
Как было упомянуто в начале этой главы, регулярные выражения представлены в виде объектов
<b>RegExp</b>
. Помимо конструктора
<b>RegExp(),</b>
объекты
<b>RegExp</b>
поддерживают три метода и несколько свойств. Методы поиска и свойства класса
<b>RegExp</b>
описаны в следующих двух подразделах.