Опубликован: 01.03.2005 | Доступ: свободный | Студентов: 33933 / 4546 | Оценка: 4.31 / 4.06 | Длительность: 16:41:00
ISBN: 978-5-9556-0026-0
Лекция 13:

Регулярные выражения

< Лекция 12 || Лекция 13: 12345 || Лекция 14 >

Примеры (^ и $)

  1. Пусть дан такой текст, записанный в виде строки:
    $str = "11 aaa bbb ".
               "ccc 22 ddd ".
                  "eee ggg 33";
    Таблица 13.1. Метасимволы, распознаваемые ВНУТРИ квадратных скобок
    Метасимвол Значение
    \ Переходный символ со множеством назначений
    ^ Отрицание класса, но только если это первый символ (например, " ^\d " задает все, кроме цифр)
    - Задает диапазон символов (например, " 0-9 " задает все цифры, " A-Z " – все латинские буквы)
    ] Вычисляет символьный класс

    Регулярное выражение /\d\d/m может быть сопоставлено следующим подстрокам: 11, 22, 33. Если в начале РВ стоит ^, то совпадения ищутся в начале строки, поэтому выражение /^\d\d/m найдет только 11.

    Когда в конце РВ стоит знак доллара $, поиск производится в конце строки, поэтому выражение /\d\d$/m найдет только 33.

    Шаблону же /^\d\d\d$/ будет удовлетворять строка, целиком состоящая из трехзначного числа (т.е. она и начинается и заканчивается этим числом).

  2. Найдем все html-теги, расположенные в начале каждой строки файла 1.htm.
    <?
    //считываем файл в строку
    $str = file_get_contents('1.htm');
    $pattern = "!^<[^/]+>!mU";
    // осуществляем поиск
    $n = preg_match_all ($pattern, 
                         $str, $res);
    // выводим результаты 
    for ($i=0;$i<$n;$i++)  
       echo htmlspecialchars($res[0][$i]).
                             "<br>";
    ?>
    Таблица 13.2. Метасимволы, распознаваемые ВНЕ квадратных скобок
    Метасимвол Значение
    \ Переходный символ со множеством назначений
    ^ Объявляет начало объекта (или строки в многострочном режиме). То есть этот символ определяет, что искомый текст должен находиться в начале строки. Альтернатива: " \A "
    $ Объявляет конец объекта (или строки в многострочном режиме). То есть этот символ определяет, что искомый текст должен находиться в конце строки. Альтернативы: " \Z ", " \z "
    . Совпадает с любым символом, кроме символа перевода строки (по умолчанию)
    [ Начинает определение символьного класса
    ] Заканчивает определение символьного класса
    | Разделяет перечисление альтернативных вариантов
    ( Начинает подшаблон (регулярное подвыражение )
    ) Заканчивает подшаблон
    ? Расширяет значение " ( ", квантификаторов 0 или 1, и квантификатор минимизации
    * 0 или больше повторений ( квантификатор )
    + 1 или больше повторений ( квантификатор )
    { Начинает минимальный/максимальный квантификатор
    } Заканчивает минимальный/максимальный квантификатор

    Шаблон ограничен восклицательными знаками. Первая " ^ " значит, что мы ищем совпадения в начале строк, потом идет символ " < " – его и ищем в строке, после него должно идти все, что угодно, кроме слэша (конструкция " [^/] " ), " + " говорит, что стоящий перед ним символ повторяется один и более раз и заканчивается все это символом " > ". Таким образом, выделяются все теги в начале строк.

  3. Мы хотим убедиться, что имя автора было записано правильно (сначала фамилия с большой буквы, потом инициалы через точку) и находится в конце строки.
    <?
    //считываем файл в строку
    $str = file_get_contents('1.htm');
    $pattern = "!\s[А-Я][А-Яа-я]+".
     "\s([А-Я]\.\s*)([А-Я]\.\s*)$!m";
    // шаблон ограничен восклицатель-
    // ными знаками, m – модификатор,
    // включающий многострочный режим.
    // Первый \s означает, что перед 
    // фамилией должен идти пустой 
    // символ (например, пробел).  
    // [А-Яа-я] задает одну из букв  
    // алфавита в любом регистре, а в  
    // комбинации со знаком плюс 
    // определяет, что эта буква 
    // повторяется один и более 
    // раз. Следующий \s означает, что 
    // между фамилией  и инициалами 
    // должен быть пробел.
    // Далее идет подвыражение,  
    // определяющее инициалы.
    // Это буква от А до Я, после
    // которой стоит точка ('\.')
    // Экранируем точку, чтобы   
    // избавиться от ее специального   
    // значения. После буквы с точкой 
    // может идти или не идти пробел 
    // или несколько. Вся конструкция 
    // повторяется минимум два раза.
    // Последний символ $ означает,
    // что фамилия с инициалами
    // должны находиться в конце 
    // строки. 
    // осуществляем поиск
    $n = preg_match_all ($pattern,
                         $str, $res);
    // выводим результаты
    for ($i=0;$i<$n;$i++) 
       echo htmlspecialchars($res[0][$i]).
                             "<br>"; 
    ?>

Примеры ( | и .)

  1. Пусть имеется некий текст. Нам нужно найти всех упомянутых в нем людей со званиями.
<?
$str = "Доцент Смирнов совершил ". 
   "открытие. Его учителем была ".
     "профессор Иванова. ".
       "Этим открытием Смирнов ".
        "завоевал себе степень ".
          "доктора. Раньше он был ".
           "только кандидат.";
$pattern = "/(профессор|доцент)".
            "\s[А-Я][А-Яа-я]+(\s|\.)/i";
// осуществляем поиск
$n = preg_match_all ($pattern, $str,
                                $res);
// выводим результаты
for ($i=0;$i<$n;$i++) 
   echo htmlspecialchars($res[0][$i]).
                         "<br>";
?>

Метасимвол прямая черта " | " позволяет задавать альтернативные варианты. В примере мы хотели найти всех профессоров или доцентов. Для этого было создано подвыражение " (профессор|доцент) ". После звания через пробел фамилия человека, которому оно принадлежит, – для этого существует комбинация " \s[А-Я][А-Яа-я]+ ". После фамилии идет либо опять пробел, либо точка, если это конец предложения. Получаем опять два альтернативных варианта: " (\s|\.) " (здесь точка экранируется обратным слэшем, чтобы она понималась как обычная точка, без специального значения).

< Лекция 12 || Лекция 13: 12345 || Лекция 14 >
Дарья Федотова
Дарья Федотова
Сергей Березовский
Сергей Березовский

В рамках проф. переподготовки по программе "Программирование"

Есть курсы, которые я уже прошел. Но войдя в курс я вижу, что они не зачтены (Язык Ассемблера и архитектура ЭВМ, Программирование на С++ для профессионалов). Это как?

Галина Федорова
Галина Федорова
Россия, Белебей
Наталья Ильина
Наталья Ильина
МАИ, 1980