Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Обработка ошибок в JavaScript




Группировка элементов и обратные ссылки

Анкеры

С помощью анкеров можно указать, в каком месте строки должно быть найдено соответствие с шаблоном.

В JavaScript определены следующие анкеры:

· ^ – соответствует позиции в начале строки;

· $ – соответствует позиции в конце строки;

· \b – соответствует границе слова, т.е. границе между словом и пробельным символом;

· \B – соответствует не границе слова.

К сожалению, анкеры \b и \B действуют только для строк, состоящих из латинских букв.

 

Пример 4.4.95. Использование анкеров в регулярных выражениях:

// Исходная строка

inputString = "Глава 1. Пролог\nCодержимое - глава 1" +

"\n...\nГлава 12. Эпилог\nГлава 12: содержимое";

// Определение шаблона

re13 =/^Глава \d{1,2}\..*/gm;

// Формирование массива соответствия шаблону

matchArray = inputString.match(re13);

// Вывод массива соответствий шаблону в цикле

for(i = 0; i < matchArray.length; i++)

// Вывод текущего соответствия шаблону

alert("result[" + i + "]='" + matchArray[i] + "'");

В этом фрагменте сценария выполняется вывод оглавления по следующему шаблону: строка "Глава" в начале строки, затем пробел, затем одна или две цифры, затем точка, затем любое содержимое до конца строки.

В результате выполнения фрагмента на экран будут выведены следующие сообщения:

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

 

Предположим, что необходимо найти в строке одно из следующих слов:

белый, красный, зеленый, желтый или черный

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

"белый|красный|зеленый|желтый|черный",

однако, с учетом того, что все приведенные слова имеют одинаковое окончание "ый", можно данный шаблон записать короче, используя группировку символов:

"(бел|красн|зелен|желт|черн)ый"

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

"(бел|желт|(крас|зеле|чер)н)ый".

 

Если в регулярных выражениях используются скобки, части искомой строки, соответствующие фрагментам в скобках, запоминаются в специальных переменных $1 (первый фрагмент в скобках), $2 (второй фрагмент в скобках), $3 (третий фрагмент в скобках) и т.д. Такая операция называется захватом (capture) переменной.

Для вложенных скобок переменные $1-$9 формируются в порядке появления левой (открывающей) скобки выражения. При использовании группировки свойство lastParen (сокращение $+) объекта RegExp возвращает последнюю найденную группу символов.

Следует отметить, что переменные модифицируются при каждом успешном поиске, независимо от использования в регулярном выражении скобок. Кроме того, значения этих переменных устанавливаются тогда и только тогда, когда строка полностью соответствует шаблону. В противном случае значения этих переменных равны пустой строке.

 

Пример 4.4.96. Использование свойств $1-$9 и lastParen объекта RegExp в регулярных выражениях:

// Исходная строка

inputString = "067-892-13-48 055-745-08-01";

// Определение шаблона

re14 =/((\d{3})-(\d{3}-\d\d-\d\d))/g;

// Определение первого соответствия шаблону

result = re14.exec(inputString);

// Определение остальных соответствий шаблону в цикле

for(i=1; result!= null; i++)

{

// Вывод значения переменных $1, S2 и $3,

// а также свойства lastParen объекта RegExp

alert(i +"). Телефон: " + RegExp.$1 +

"\nКод оператора: " + RegExp.$2 +

" Номер: " + RegExp.$3 +

"\nlastParen=" + RegExp.lastParen);

// Определение следующего соответствия шаблону

result = re14.exec(inputString);

}

Скобки в шаблоне мобильного телефона в этом фрагменте сценария позволяют выделить весь телефонный номер ($1) и его отдельные части – код оператора ($2) и собственно номер телефона ($3).

В результате выполнения фрагмента на экран будут выведены следующие сообщения:

 

Переменные $1-$9 можно записывать и в выражении шаблона в форме \ i, где i – номер переменной. Переменную называет обратной ссылкой.

 

Пример 4.4.97. Использование обратной ссылки в регулярных выражениях

Изменим шаблон для номера мобильного телефона следующим образом:

/((\d{3})-(\d{3}-(\d\d)-\4))

Такая запись означает, что последняя пара цифр должна совпадать с предпоследней парой цифр (значением переменой $4). В этом случае телефон 094-996-18-18 будет удовлетворять шаблону, а телефон 094-996-18-19 – не будет.

 

Переменные $1-$9 не всегда необходимо использовать как результат поиска соответствия шаблону. В случае, когда необходимо сгруппировать какие-либо символы шаблона, но не выполнять для них операции по определению соответствующих переменных (не выполнять для них операцию захвата), используется следующая форма группирования:

(?: символы)

 

Пример 4.4.98. Использование операции группирования без захвата в регулярных выражениях

Шаблон

"сет(?:ь|и|ью|ей|ям|ями|ях)"

будет выполнять в строке поиск слова "сеть" во всех падежах единственного и множественного числа, но при этом переменная $1 не создается.

 

Другим видом группировки является «заглядывание вперед». Группирование в этом случае записывается в следующем виде:

(?= символы)

В этом случае при поиске соответствия шаблону учитываются символы, заданные в скобках, но в результат поиска эти символы не входят. Следующий поиск начинается с позиции, с которой начинаются символы в скобках, т.е. результат «заглядывания вперед» не учитывается.

Вторая форма группировки с «заглядыванием вперед» записывается в следующем виде:

(?! символы)

В отличие от первой формы символы в скобках не должны содержаться в соответствии шаблону. В результат поиска эти символы не входят и результат «заглядывания вперед» также не учитывается.

 

Пример 4.4.99. Использование операции группирования «с заглядыванием вперед» в регулярных выражениях:

1. В следующем примере слово "компьютер" будет соответствовать шаблону только в том случае, если справа от него находится граница слова, т.е. после этого слова должен следовать либо пробельный символ, либо один из знаков препинания. В найденные соответствия пробельные символы и знаки препинания не входят:

// Исходная строка

inputString = "Персональный компьютер. Компьютер - это " +

"устройство для обработки данных. Компьютерное " +

"оборудование выпускается многими фирмами";

// Определение шаблона

re15 =/компьютер(?=\s|[.,;:?!)()])/ig;

// Определение первого соответствия шаблону

result = re15.exec(inputString);

// Определение остальных соответствий шаблону в цикле

for(i=1; result!= null; i++)

{

// Вывод найденного соответствия шаблону

// и его индекса в строке

alert("result='" + result + "' index=" + result.index);

// Определение следующего соответствия шаблону

result = re15.exec(inputString);

}

В этом фрагменте сценария слово "компьютер" будет соответствовать шаблону только в том случае, если справа от него находится граница слова, т.е. после этого слова должен следовать либо пробельный символ, либо один из знаков препинания. В найденные соответствия пробельные символы и знаки препинания не входят:

В результате выполнения фрагмента на экран будут выведены следующие сообщения:

Символы "Компьютер" в слове "Компьютерное" не соответствуют шаблону, поскольку после символа "р" следует буква, а не пробельный символ или знак препинания.

 

2. Если в предыдущем примере изменить шаблон следующим образом:

re15 =/компьютер(?!\s|[.,;:?!)()])/ig;

то в результате выполнения фрагмента на экран будет выведено следующее сообщение:

В данном случае, наоборот, соответствовать шаблону будут символы "Компьютер" в слове "Компьютерное", поскольку символ "н", который следует после символа "р" не совпадает ни с одним из символов, указанных в группировке.




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


Дата добавления: 2014-01-05; Просмотров: 290; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.027 сек.