Чтение онлайн

ЖАНРЫ

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

10.2. Методы класса String для поиска по шаблону

До этого момента мы обсуждали грамматику создаваемых регулярных выражений, но не рассматривали, как эти регулярные выражения могут фактически использоваться в JavaScript-сценариях. В данном разделе мы обсудим методы объекта

String
, в которых регулярные выражения применяются для поиска по шаблону, а также для поиска с заменой. А затем продолжим разговор о поиске по шаблону с регулярными выражениями, рассмотрев объект
RegExp
, его методы и свойства. Обратите внимание, что последующее обсуждение - лишь обзор различных
методов и свойств, относящихся к регулярным выражениям. Как обычно, полное описание можно найти в третьей части книги.

Строки поддерживают четыре метода, использующие регулярные выражения. Простейший из них - метод

search.
Он принимает в качестве аргумента регулярное выражение и возвращает либо позицию первого символа найденной подстроки, либо
– 1
, если соответствие не найдено. Например, следующий вызов вернет 4:

"JavaScript".search(/scгіpt/i);

Если аргумент метода

search
не является регулярным выражением, он сначала преобразуется путем передачи конструктору
RegExp
. Метод
search
не поддерживает глобальный поиск и игнорирует флаг
g
в своем аргументе.

Метод

replace
выполняет операцию поиска с заменой. Он принимает в качестве первого аргумента регулярное выражение, а в качестве второго - строку замены.

Метод отыскивает в строке, для которой он вызван, соответствие указанному шаблону. Если регулярное выражение содержит флаг

g
, метод
герlасе
заменяет все найденные совпадения строкой замены. В противном случае он заменяет только первое найденное совпадение. Если первый аргумент метода
герlасе
является строкой, а не регулярным выражением, то метод выполняет буквальный поиск строки, а не преобразует его в регулярное выражение с помощью конструктора
RegExp,
как это делает метод
search.
В качестве примера мы можем воспользоваться методом
replace
для единообразной расстановки прописных букв в слове «JavaScript» для всей строки текста:

// Независимо от регистра символов заменяем словом в нужном регистре

text.replace(/JavaScript/gi, "JavaScript");

Метод

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

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

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

var quote = /'([~"]*/g;

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

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

text. replace(quote, "«$1»");

Метод

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

Метод

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

"1 плюс 2 равно 3".match(/\d+/g) // вернет ["1", "2", "3"]

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

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

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

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

var text = "Посетите мою домашнюю страницу http://www.exarnple.com/"david ";

var result = text.match(url);

if (result != null) {

var fullurl = result[0]; // Содержит " http://www.example.com/"david "

var protocol = result[1]; // Содержит "http"

var host = result[2]; // Содержит " www.example.com "

var path = result[3]; // Содержит "david"

}

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

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

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

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

"123,456,789".split(","); // Вернет ["123","456","789"]

Метод

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

"1, 2, 3 , 4 , 5".split(/\s*,\s*/); // Вернет ["1","2","З","4","5"]

Метод

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

10.3. Объект RegExp

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

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

Поделиться с друзьями: