Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASCII и latin.docx
Скачиваний:
3
Добавлен:
08.08.2019
Размер:
190.09 Кб
Скачать

11.1.6. Флаги

И еще один, последний элемент грамматики регулярных выражений. Флаги ре

гулярных выражений задают высокоуровневые правила соответствия шаблонам.

Символ Значение

^ Соответствует началу строкового выражения или началу строки при мно

гострочном поиске.

$ Соответствует концу строкового выражения или концу строки при много

строчном поиске.

\b Соответствует границе слова, т. е. соответствует позиции между символом

\w и символом \W или между символом \w и началом или концом строки.

(Однако обратите внимание, что [\b] соответствует символу забоя.)

\B Соответствует позиции, не являющейся границей слов.

(?=p) Положительное условие на последующие символы. Требует, чтобы после

дующие символы соответствовали шаблону p, но не включает эти символы

в найденную строку.

(?!p) Отрицательное условие на последующие символы. Требует, чтобы следую

щие символы не соответствовали шаблону p.11.2. Методы класса String для поиска по шаблону 223

В отличие от остальной грамматики регулярных выражений, флаги указывают

ся не между символами слэша, а после второго из них. JavaScript 1.2 поддержи

вает два флага. Флаг i указывает, что поиск по шаблону должен быть нечувстви

тельным к регистру символов, а флаг g – что поиск должен быть глобальным,

т. е. должны быть найдены все соответствия в строке. Оба флага могут быть объ

единены для выполнения глобального поиска без учета регистра символов.

Например, чтобы выполнить безразличный к регистру поиск первого вхожде

ния слова «java» (или «Java», «JAVA» и т. д.), можно воспользоваться нечувст

вительным к регистру регулярным выражением /\bjava\b/i. А чтобы найти все

вхождения этого слова в строке, надо добавить флаг g: /\bjava\b/gi.

JavaScript 1.5 поддерживает дополнительный флаг m, который выполняет поиск

по шаблону в многострочном режиме. Если строковое выражение, в котором вы

полняется поиск, содержит символы перевода строк, то в этом режиме якорные

символы ^ и $, помимо того, что они соответствуют началу и концу всего строко

вого выражения, также соответствуют началу и концу строки. Например, шаб

лону /Java$/im соответствует как слово «java», так и «Java\nis fun».

В табл. 11.6 приводится перечень флагов регулярных выражений. Заметим, что

флаг g более подробно рассматривается далее в этой главе вместе с методами

классов String и RegExp, используемых для фактической реализации поиска.

Таблица 11.6. Флаги регулярных выражений

11.1.7. Средства регулярных выражений Perl,

не поддерживаемые в JavaScript

Мы говорили, что ECMAScript v3 определяет относительно полное подмножест

во средств регулярных выражений из Perl 5. Развитые средства Perl, не поддер

живаемые ECMAScript, включают следующее:

• флаги s (однострочный режим) и x (расширенный синтаксис);

• управляющие последовательности \a, \e, \l, \u, \L, \U, \E, \Q, \A, \Z, \z и \G;

• (?<= – положительное условие на предыдущие символы и (?<! – отрицатель

ное условие на предыдущие символы;

• комментарий (?# и прочий расширенный синтаксис (?.

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

До этого момента мы обсуждали грамматику создаваемых регулярных выраже

ний, но не рассматривали, как эти регулярные выражения могут реально ис

пользоваться в JavaScriptсценариях. В данном разделе мы обсудим методы объ

Символ Значение

i Выполняет поиск, нечувствительный к регистру.

g Выполняет глобальный поиск, т. е. находит все соответствия, а не оста

навливается после первого из них.

m Многострочный режим. ^ соответствует началу строки или началу всего

строкового выражения, а $ – концу строки или всего выражения.224 Глава 11. Шаблоны и регулярные выражения

екта String, в которых регулярные выражения применяются для поиска по шаб

лону, а также для поиска и замены. А затем продолжим разговор о поиске по

шаблону с регулярными JavaScriptвыражениями, рассмотрев объект RegExp, его

методы и свойства. Обратите внимание: последующее обсуждение – это лишь об

зор различных методов и свойств, относящихся к регулярным выражениям.

Как обычно, полное описание можно найти в третьей части книги.

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

Простейший из них – метод search(). Он принимает в качестве аргумента регу

лярное выражение и возвращает либо позицию символа в начале первой найден

ной подстроки, либо –1, если соответствие не найдено. Например, следующий

вызов возвращает 4:

"JavaScript".search(/script/i);

Если аргумент метода search() не является регулярным выражением, он сначала

преобразуется путем передачи конструктору RegExp. Метод search() не поддержи

вает глобальный поиск и игнорирует флаг g в своем аргументе.

Метод replace() выполняет операцию поиска с заменой. Он принимает в качестве

первого аргумента регулярное выражение, а в качестве второго – строку замены.

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

Если регулярное выражение содержит флаг g, метод replace() заменяет все вхо

ждения строки строкой замены, в противном случае он заменяет только первое

найденное вхождение. Если первый аргумент метода replace() представляет со

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

строки, а не преобразует ее в регулярное выражение с помощью конструктора

RegExp(), как это делает метод search(). В качестве примера мы можем воспользо

ваться методом replace() для единообразной расстановки прописных букв в сло

ве «JavaScript» для всей строки текста:

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

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

Однако метод replace() представляет собой более мощное средство, чем можно су

дить по этому примеру. Вспомните, что подвыражения в скобках, находящиеся

внутри регулярного выражения, нумеруются слева направо, и что регулярное

выражение запоминает текст, соответствующий каждому из подвыражений. Ес

ли в строке замены присутствует знак $ с цифрой, метод replace() заменяет эти

два символа текстом, соответствующим указанному подвыражению. Это очень

полезная возможность. Мы можем использовать ее, например, для замены пря

мых кавычек в строке типографскими кавычками, которые имитируются ASCII

символами:

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

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

// еще одна кавычка.

var quote = /"([^"]*)"/g;

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

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

text.replace(quote, "``$1''");

Метод replace() предоставляет и другие ценные возможности, о которых расска

зывается в третьей части книги при описании конструкции String.replace(). Са11.2. Методы класса String для поиска по шаблону 225

мое важное, что следует отметить, – второй аргумент replace() может быть функ

цией, динамически вычисляющей строку замены.

Метод match() – это наиболее общий из методов класса String, опирающихся на

регулярные выражения. Он принимает в качестве единственного аргумента ре

гулярное выражение (или преобразует свой аргумент в регулярное выражение,

передав его конструктору RegExp()) и возвращает массив, содержащий результа

ты поиска. Если в регулярном выражении установлен флаг g, метод возвращает

массив всех соответствий, присутствующих в строке. Например:

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

Если регулярное выражение не содержит флаг g, метод match() не выполняет гло

бальный поиск; он просто ищет первое соответствие. Однако match() возвращает

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

вый элемент массива – это найденная строка, а все оставшиеся элементы пред

ставляют собой подвыражения регулярного выражения. Поэтому если match()

возвращает массив a, то a[0] будет содержать найденную строку целиком, a[1] –

подстроку, соответствующую первому подвыражению, и т. д. Проводя парал

лель с методом replace(), можно сказать, что в a[n] заносится содержимое $n.

В качестве примера рассмотрите следующий программный код, выполняющий

разбор URLадреса:

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

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

var result = text.match(url);

if (result != null) {

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

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

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

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

}

И наконец, имеется еще одна особенность метода match(), о которой следует

знать. Возвращаемый им массив имеет, как и все массивы, свойство length. Од

нако когда match() вызывается с регулярным выражением без флага g, возвра

щаемый массив имеет еще два свойства: index, содержащее номер позиции сим

вола внутри строки, с которого начинается соответствие, и input, являющееся

копией строки, в которой выполнялся поиск. То есть в приведенном примере

значение result.index будет равно 31, т. к. найденный URLадрес начинается

в тексте с 31й позиции. Свойство result.input должно содержать ту же строку,

что и переменная text. Для регулярного выражения r, в котором не установлен

флаг g, вызов s.match(r) возвращает то же значение, что и r.exec(s). Немного

позднее в этой главе мы обсудим метод RegExp.exec().

Последний из методов объекта String, в котором используются регулярные вы

ражения, – это split(). Этот метод разбивает строку, для которой он вызван, на

массив подстрок, используя аргумент в качестве разделителя. Например:

"123,456,789".split(","); // Возвращает ["123","456","789"]

13.2. Встраивание JavaScriptкода

вHTMLдокументы

Клиентский JavaScriptкод может встраиваться в HTMLдокументы нескольки

ми способами:

• между парой тегов <script> и </script>;

• из внешнего файла, заданного атрибутом src тега <script>;

• в обработчик события, заданный в качестве значения HTMLатрибута, такого

как onclick или onmouseover;

• как тело URLадреса, использующего специальный спецификатор псевдо

протокола javascript:.

В этом разделе описываются теги <script>. Порядок встраивания JavaScriptко

да в обработчики событий и URL описан в этой главе позже.

13.2.1. Тег <script>

Клиентские JavaScriptсценарии представляют собой часть HTMLфайла и нахо

дятся между тегами <script> и </script>:

<script>

// Здесь располагается JavaScriptкод

</script>

В языке разметки XHTML содержимое тега <script> обрабатывается наравне с со

держимым любого другого тега. Если JavaScriptкод содержит символы < или &,

они интерпретируются как элементы XMLразметки. Поэтому в случае примене

ния языка XHTML лучше помещать весь JavaScriptкод внутрь секции CDATA:

<script><![CDATA[// Здесь располагается JavaScriptкод

]]></script>

Единственный HTMLдокумент может содержать произвольное число элементов

<script>. При наличии нескольких отдельных сценариев, они будут запускаться

в порядке их следования в документе (исключение составляет атрибут defer, опи

санный в разделе 13.2.4). Хотя отдельные сценарии в одном файле исполняются

в различные моменты времени, в процессе загрузки и анализа HTMLфайла они

представляют собой части одной JavaScriptпрограммы: функции и переменные,

определенные в одном сценарии, доступны всем сценариям, находящимся в том

же файле. Например, в HTMLстранице может быть следующий сценарий:

<script>function square(x) { return x*x; }</script>

Ниже на той же HTMLстранице вы можете вызывать функцию square(), причем

даже в другом блоке сценария. Контекстом является HTMLстраница, а не блок

сценария:1

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]