Веб-программирование

Обучение программированию

Делаете первые шаги в программировании? Представляем вашему вниманию пошаговое обучение самостоятельного создания сайтов любой сложности на примерах! На страницах сайта KobRU вы найдете все самое необходимое, для того чтобы по праву считаться веб-мастером по созданию привлекательных динамически изменяемых интернет-страниц, используя основные инструменты веб-разработчиков: HTML; CSS; PHP; MySQL; JAVASCRIPT и другие. Сайт KobRU - наиболее полное и качественно структурированное руководство с предельно понятными пояснениями и поэтапным изложением материала, который поможет вам в совершенстве овладеть искусством программирования. Добавьте динамики и интерактивность в свои веб-проекты!

Вход в личный кабинет

Забыли пароль?

Не зарегистрированны?


Конструкторское Web-бюро
8.03.3 Объект RegExp Часть III

Автор: Denisido

Дата: 2010-08-09

Альтернативы

В предыдущем уроке мы с вами рассматривали построение символьного класса, где внутри квадратных скобок может совпадать только один символ из всех возможных, к примеру, шаблон [ВГ]аля совпадает или со словом Валя или с Галя. Альтернативы тоже означают или, но в отличие от класса способны искать сразу несколько символов. Они обычно записываются в скобках, между которыми ставится знак |. Сравните:

// первый вариант
[ВГ]аля
// второй вариант
(В|Г)аля
// третий вариант 
(Валя|Галя) - запись в скобках
 Валя|Галя  - запись без скобок
/* скобки нужны для того, чтобы отделить конструкцию выбора от остального выражения */
Запустить!
var text = 'Ознакомьтесь с книжкой о регулярных выражениях автора ...';
var regex = /кни(г|жк)ой/g;      // ввод шаблона на поиск слов книгой или книжкой
var result = text.match(regex);  // ищем совпадения
alert(result);
Запустить!
var text = 'Книга о регулярных выражениях автора ...';
var regex = /кни(г|жк)а/g;       // ввод шаблона на поиск слов книга или книжка
var result = text.match(regex);  // ищем совпадения
alert(result);                   // выводим результат в модальное окно (выведет null)

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

Запустить!
var text = 'Книга о регулярных выражениях автора ...';
var regex = /[Кк]ни(г|жк)а/g;    // вводим шаблон
var result = text.match(regex);  // ищем совпадения
alert(result);                   // выводим результат в модальное окно

Теперь наш шаблон совпал, но что будет, если в слове есть опечатка, например, КНига или все слово написано в верхнем регистре КНИГА. К счастью, есть специальный флаг (иногда называют ключ, существует и более глобальное название - модификатор), который способен выполнять поиск по шаблону без учета регистра. Он обозначается в виде английской буквы i и ставится после окончания шаблона (после закрывающегося слэша):

Запустить!
var text = 'Книга о регулярных выражениях автора ...';
var regex = /кни(г|жк)а/ig;      // вводим шаблон
var result = text.match(regex);  // ищем совпадения
alert(result);                   // выводим результат в модальное окно

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

Позиции соответствия (символ \b)

Представьте себе такую картину, Вы ищете слово, которое обозначает переменную, т.е. var. Но такая же последовательность символов может встречается не только в этом отдельном слове, но и в другом слове, например, avarice. В нашем случае нужно определить начальную позицию, после которой идет три последовательных символа v a r, за которыми сразу следует конечная позиция, т.е. начало слова далее var, затем конец слова. Символ начала и конца слова записывается в виде \b:

Запустить!
var text = 'Создаем новую переменную var avarice';
var regex = /\bvar\b/gi;           // вводим шаблон
var result = text.match(regex);    // ищем совпадения
alert(result);                     // выводим результат в модальное окно

Их иногда называют якорными элементами регулярных выражений, поскольку они фиксируют шаблон за определенной позицией в строке. Очень часто применяют такие якорные элементы, как ^ (символ начала строки) и $ (символ конца строки), о которых говорилось выше.

Любой пропуск (символы \s и \S)

Сказать по правде, символ \b конфликтует с русскими буквами, но стоит заметить, что львиная доля поиска по шаблону записывается с использованием метасимволов и латинских символов. Тем не менее, если вы точно знаете, что нужно найти слово, перед и после которого существует пробел, то можно записать так:

Запустить!
var text = 'ударение дар ударная волна - все слова содержат послед. символы "дар"';
var regex = / дар /gi;              // пробел дар пробел
var result = text.match(regex);     // ищем совпадения
alert(result);     /* найдет только 2-е слово дар, которое имеет пробелы по бокам. Если бы мы не ставили пробелы вывелся бы массив из 4-х дар ['дар','дар','дар','дар'] */

В нашем случае знаки пробела можно заменить символом \s, который не только совпадает с пробелом, но и с табуляцией, символом новой строки и возврата каретки:

Запустить!
var text = 'ударение дар ударная волна - все слова содержат послед. символы "дар"';
var regex = /\sдар\s/gi;            // вводим шаблон
var result = text.match(regex);     // ищем совпадения
alert(result);                      // выводим результат в модальное окно

/*
 Замечание!
Символ \S в отличие от \s ищет все знаки, кроме знаков пробела табуляции, новой строки и возврата каретки, т.е. противоположно \s
*/

Имейте в виду, что данное решение проблематично. Во-первых, шаблон обнаружит слово дар в том случае, если оно окружено пробелами с обеих сторон, и точно не найдет его в начале или в конце строки. Во-вторых, после положительного поиска возвратит наше выражение вместе с этими пробелами, что не очень то хотелось. Касаетельно пробелов, то можно воспользоваться функцией trim(), которая обрезала бы лишние пробелы и возвращала наше значение без них, но могущество регулярных выражений заслуживает уважение и склоняет наше предпочтение к их использованию. Например поставленную задачу с русскими литералами можно изначально решить так:

Запустить!
var text = 'ударение дар ударная волна - все слова содержат послед. символы "дар"';
var regex = /(^|\B)дар(?=(\s|$))/gi;  // вводим шаблон
var result = text.match(regex);       // ищем совпадения
alert(result);                        // выводим результат в модальное окно

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



Оцените материал по 5-ти бальной шкале: 1 2 3 4 5



Коментарии:

Добавить новый коментарий:

Текст коментария:

Введите результат с картинки

Просмотров: 7176

Метки раздела JavaScript

Основы web программирования, var javascript, javascript функции, javascript обучение, javascript простые примеры, html javascript, javascript примеры, javascript random, уроки сайтостроения, java script, регулярные выражения, appendchild javascript, javascript бесплатно, javascript document write, javascript справочник, javascript примеры.