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

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

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

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

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

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


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

Автор: Denisido

Дата: 2010-08-28

Круглые скобки и обратные ссылки в регулярных выражениях

Когда мы рассматривали альтернативы, то применяли круглые скобки для отделения конструкции выбора от остального выражения. Кроме разделителя, круглые скобки также запоминают текст совпадения. Давайте с вами попробуем отыскать волшебные даты, такие как 10.10.2010:

Запустить!
var text = '10.10.2010';
var regex = /\b(\d{2})[-./]\1[-./](?:\d{2})?\1\b/g
var result = text.match(regex);
alert(result);

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

var regex = /\d\d\.\d\d\.\d\d\d\d/; // - первым делом записываем привычный вариант
// ПРИМЕЧАНИЕ: экранизация точки выполняется обратным слэшем!!!
var regex = /\d{2}\.\d{2}\.d{4}/;  // сокращаем запись с помощью квантификаторов
/* Нам нужно, чтобы первая пара цифр до точки совпадала со второй парой до точки */
var regex = /(\d{2})\.\1\.\d{4}/; // переписываем шаблон с сохраненной первой парой
// Первая пара цифр сохранилась и мы ее повторяем прописав \1, теперь идем далее...
// перезаписываем год, так как нам нужно волшебное совпадение: число, месяц и год
var regex = /(\d{2})\.\1\.\d{2}\1/; // снова подставляем сохраненное значение \1
// вместо точки, как разделителя могут стоять другие символы (слэшь или дефис)
var regex = /(\d{2})[-./]\1[-./]\d{2}\1/; //применяем к разделителям символьный класс
/* Формат может быть таким хх/хх/хххх или таким хх/хх/хх, поэтому делаем первые 2 цифры года необязательными для поиска */
var regex = /(\d{2})[-./]\1[-./](\d{2})?\1/; // используем квантификатор ?
// для надежности определим границы с помощью символа \b
var regex = /\b(\d{2})[-./]\1[-./](\d{2})?\1\b/;

Чтобы прийти к конечной цели, нам понадобилось переписать наш шаблон семь раз. Здесь нужно учесть такие моменты:
- экранирование символов в шаблоне записывается в виде обратного слэша (в нашем случае это была точка, которая без экранирования может совпасть с абсолютно любым символом в регулярном выражении);
- скобки сохраняют текст совпадения, например (a)(b)(c)(5) \1=a \2=b \3=c \4=5;
- и последний момент - это конструкция (?:выражение), о которой мы ничего не сказали.

Несохраняющие круглые скобки: (?:выражение)

Бывают случаи, когда конструкцию, производящую группировку сохранять совсем не нужно. В таких ситуациях применяется специальная разновидность круглых скобок (?:выражение):

var text = '123456';
var regex1 = /((?:\d\d{1,3}))/; // \1 запомнит 123456 и все
var regex2 = /((\d\d{1,3}))/; // \1 запомнит 123456, а \2 запомнит 56

Во 2 строке кода мы записали открывающуюся круглую скобку, состоящую из трех символов (?: после выражение \d\d{1,3} и в конце закрыли скобку. Такое решение обладает двумя преимуществами. Первое – повышение эффективности поиска за счет исключения лишнего сохранения. Второе преимущество – точное указание типа скобок упрощает последующее чтение программы и снимает вопросы относительно того, для чего нужна та или иная пара скобок.

Опережающая позитивная проверка

Такая проверка относится к якорным метасимволам и совпадает не с символами, а с позицией в тексте. В задачу этой проверки входит анализ текста, расположенного справа, и проверка на возможность совпадения подвыражения. Позитивная опережающая проверка задается специальной последовательностью (?=выражение):

Запустить!
var text = '

если a < b, то

'; var regex = /\<(?=\/)/g; // вводим шаблон на поиск совпадений var result = text.match(regex); // записываем совпадение в переменную result alert(result); // выведет <, который находится перед /

Опережающая негативная проверка

Принцип действия этой проверки такой же как и у позитивной опережающей проверки, за тем исключением, что текст не может совпасть справа с подвыражением. Позитивная опережающая проверка задается специальной последовательностью (?!выражение):

Запустить!
var text = '

Петров Иван и Петров Василий - два однофамильца

'; var regex = /Петров(?!<\/b>)/g; // вводим шаблон на поиск совпадений var result = text.match(regex); // записываем совпадение в переменную result alert(result); // выведет фамилию Петров (который Иван) и пропустит Петрова Василия

Позитивная ретроспективная проверка

Выполняет проверку соседних символов, находящихся слева от подвыражения и задается специальной последовательностью (?<=выражение). К сожалению, в диалекте JavaScript поддерживается только опережающая проверка, но не поддерживается ретроспективная. Можно обойтись и без ретроспективной проверки, используя сохраняющие группы (<b>)(Петров)(?=<\/b>) или написать код, который будет имитировать ретроспективную проверку:

var regex1 = /Петров(?=<\/b>)/;
var regex2 = /<b>$/;
if (match = regex1.exec('<p>Петров Иван и <b>Петров</b> Василий - два однофамильца</p>'))
                    {
                     var ourMatch = match[0];
                     var leftContext = match.input.substing(0, match.index);
                     if (regex2.exec(leftContext)) {
                                                    alert(ourMatch);
                                                   }
                     else {alert('не то? что нужно!')}
                    }
else {alert('Слово не найдено!')}

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

<?php
$text1 = 'Уроки javascript для начинающих!';
$testResult = preg_match('/javascript/', $text1); // шаблон на поиск
echo $testResult;  // при удачном совпадени выведет 1, иначе выведет 0
?>
<?php
$text2 = 'Уроки JavaScript для начинающих!';
if(preg_match('/javascript/i', $text2)){ // флаг i означает нечувств-ность к регистру
					echo "Успешное совпадение";
				       }
else {echo "Совпадений нет!";}
?>
/* Функция preg_match() принимает необязательный 3-й аргумент, в котором сохраняется совпавший текст */
<?php
$text3 = 'Уроки JavaScript для начинающих!';
if(preg_match('/javascript/i', $text3, $groups)) {
					$result = $groups[0];
					echo $result; // выведет JavaScript
				  }
else {echo "Совпадений нет!";}
?>

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

<?php
$text4 = 'Уроки JavaScript для начинающих и javascript для профи!';
if(preg_match('/(?<=\)javascript(?=\<\/b\>)/i', $text4, $groups)) {
					$result2 = $groups[0];
				  }
else {echo "Совпадений нет!";}  // создали условие else для визуального представления
?>


В примере выше, мы сперва поработали с регулярными выражениями в диалекте PHP, а после перевели результат поиска в язык javascript, а если говорить точнее, то использовали мощную библиотеку JavaScript - jQuery. Без всяких сомнений, этот скрипт можно улучшить, но в нашу задачу входило только показать как можно взаимодействовать с регулярными выражениями на языке php.

Негативная ретроспективная проверка

Данная проверка антипод позитивной ретроспективной проверки, т.е. она выполняет проверку соседних символов, которые не могут совпадать слева. Негативная ретроспективная проверка задается последовательностью (?<!выражение):

<?php
$text5 = 'Уроки JavaScript для начинающих и javascript для профи!';
if(preg_match('/(?<!\)javascript(?!\<\/b\>)/i', $text5, $groups2)) {
					$result3 = $groups2[0];
				  }
else {echo "Совпадений нет!";}  // создали условие else для визуального представления
?>



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



Коментарии:

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

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

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

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

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

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