Содержание
-
Регулярные выражения
Кто они такие и с чем их едят? Примеры паттернов на JavaScript ФБОУ ВПО «Санкт-Петербургский государственный университет Водных коммуникаций»Кафедра вычислительных систем и информатики Работу выполнила: студентка факультета информационных технологий, группы ИС-41 Ненастьева Т.Г. Руководитель : к.т.н., доц. Попов Б.Н.
-
Кто такие RegEx?
Регулярные выражения (англ. regular expressions, сокр. RegExp, RegEx, жарг. регэкспы или регексы) — это формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов (символов-джокеров, англ. wildcard characters); строка-образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов и метасимволов и задающая правило поиска.
-
Немного истории
Регулярные выражения произвели прорыв в электронной обработке текстов в конце XX века. Набор утилит (включая текстовый редактор sed и фильтр grep), поставляемых в дистрибутивах UNIX, одним из первых способствовал популяризации регулярных выражений для обработки текстов. Многие современные языки программирования имеют встроенную поддержку регулярных выражений. Среди них ActionScript, Perl, Java, PHP, JavaScriptPython, Ruby, C++(стандарт 2011 года) и др. Регулярные выражения используются некоторыми текстовыми редакторами и утилитами для поиска и подстановки текста.
-
Немного истории
Истоки регулярных выражений лежат в теории автоматов, теории формальных языков и классификации формальных грамматик по Хомскому. Эти области изучают вычислительные модели (автоматы) и способы описания и классификации формальных языков. В 1940-х гг. УорренМакКаллоки Уолтер Питтс описали нервную систему, используя простой автомат в качестве модели нейрона. Уоррен МакКаллок(1898 - 1969) Уолтер Питтс (1923 - 1969)
-
Математик Стивен Клини позже описал эти модели, используя свою систему математических обозначений, названную «регулярные множества». Кен Томпсон встроил их в текстовый редактор QED, а затем в редактор ed под UNIX.С этого времени регулярные выражения стали широко использоваться в UNIX и UNIX-подобных утилитах, например:expr, awk, Emacs, vi (visual), lex. Клини Стивен Коул (1909 - 1994) Кен Томпсон(р. 1943)
-
РВ на JavaScript
Регулярные выражения также стали использоваться и в языках: Perl (Practical Extraction and Report Language — «практический язык для извлечения данных и составления отчётов»); Tcl (Tool Command Language — «командный язык инструментов»). Регулярные выражения в Perl и Tcl происходят от реализации, написанной Генри Спенсером. Филип Хейзел разработал библиотеку PCRE (англ. Perl-compatible regular expressions — Perl-совместимые регулярные выражения), которая используется во многих современных инструментах, таких как PHP и Apache. Генри Спенсер Филип Хейзел
-
Регулярное выражение на JavaScript -
- это инструкция, описывающая на специально разработанном языке (RegExp) закон "сходства" искомой строки с образцом. Для чего это нужно? Например: Для организации поиска в тексте чего-либо. Для замены одной части подстрок другими. Для проверки корректности пользовательского ввода. Способы задания РВ
-
Способы задания регулярных выражений
Существует два способа задания регулярных выражений: в объектной нотации – new RegExp("pattern"[, флаги]); в литеральной нотации – varp=/pattern/flags; где pattern - шаблон, является основой регулярного выражения, определяющей критерии сопоставления строк. Состоит из литералов и метасимволов. flags - флаги (модификаторы), задают дополнительные параметры сопоставления шаблона. g — глобальный поиск (обрабатываются все совпадения с шаблоном поиска); i — не различать строчные и заглавные буквы; m — многострочный поиск. Символы, используемы е в РВ. Литералы
-
Символы, используемые в РВ
Литералы(обычные символы – буквы, цифры) Каждый из таких символов представляет сам себя. Например, /abc/ - такому шаблону сопоставима только строка "abc". a-z - все строчные буквы от a до z. Например, /a-z/ - такому шаблону сопоставляются 26 строк: "a", "b", "c"... "z" A-Z - все заглавные буквы от A до Z. 0-9 - все цифры. Символы-квантификаторы
-
Символы, используемые в РВ (продолжение)
Управляющие (квантификаторы) \ - служит для экранирования специальных символов, т.е. обратный слэш перед символом указывает на то, что он должен интерпретироваться как специальный. * - указывает, что символ (или часть шаблона, если она заключена в квадратные скобки) может повторяться 0 и более раз. Например, /ab*c/ - означает, что строка начинается с символа a, затем может быть сколько угодно символов b, после которых следует символ c. Т.е. это могут быть, например, такие строки: "ac", "abc", "abbbbbbc" и т.д. + - указывает, что символ (или часть шаблона, если она заключена в квадратные скобки) может повторяться 1 и более раз. Например, /ab+c/ - означает, что строка начинается с символа a, затем может быть сколько угодно символов b (но не меньше 1), после которых следует символ c. Т.е. это могут быть, например, такие строки: "abc", "abbbbbbc" и т.д.
-
. - указывает, что на этом месте может быть любой одиночный символ, кроме символа новой строки. Например, для шаблона /ab.c/ сопоставимы такие строки: "ab6c", "abxc", "ab=c" и т.д. ? - указывает, что символ (или часть шаблона, если она заключена в квадратные скобки) может повторяться 0 или 1 раз. Например, /ab?c/ - означает, что строка начинается с символа a, затем может быть или не быть один символ b, после которого следует символ c. Т.е. это могут быть такие строки: "ac", "abc".
-
{n} - указывает, что символ (или часть шаблона, если она заключена в квадратные скобки) может повторяться ровно n раз. Например, /ab{3}c/ - означает, что строка начинается с символа a, затем идут 3 символа b, после которых следует символ c. Т.е. это будет строка "abbbc". {n,} - указывает, что символ (или часть шаблона, если она заключена в квадратные скобки) может повторяться n и более раз. Например, /ab{3,}c/ - означает, что строка начинается с символа a, затем идут 3 или более символов b, после которых следует символ c. Т.е. это могут быть такие строки: "abbbc", "abbbbbbbc" и т.д. {n, m} - указывает, что символ (или часть шаблона, если она заключена в квадратные скобки) может повторяться от n до m раз. Например, /ab{1,3}c/ - означает, что строка начинается с символа a, затем идут от 1 до 3 символов b, после которых следует символ c. Т.е. это могут быть такие строки: "abc", "abbc", "abbbc". Символы, используемые в РВ (продолжение)
-
[] - такой шаблон сопоставим с любым одиночным символом, принадлежащим множеству, определенному в скобках. Множество задается перечислением или указанием диапазона. Например, шаблону /[abc]/ могут быть сопоставимы строки: "a", "b", "c". [^] - такой шаблон сопоставим с любым одиночным символом, не принадлежащим множеству, определенному в скобках. Например, шаблону /[^abc]/ могут быть сопоставимы строки: "f", "x", "Z", но не могут быть сопоставимы строки: "a", "b", "c". | - указывает на несколько альтернативных шаблонов. Например, шаблону /ab|c/ будут сопоставимы строки: "ab" и "c". Символы, используемые в РВ (продолжение)
-
^ - указывает, что символы сопоставимы с началом строки. Например, шаблону /^abc/ могут быть сопоставимы строки: "abcd", "abcfh", но не могут быть сопоставимы строки: "dabc", "cbabc" и т.д. $ - указывает, что символы сопоставимы с концом строки. Например, шаблону /abc$/ могут быть сопоставимы строки: "dabc", "fhabc", но не могут быть сопоставимы строки: "abcd", "abccb" и т.д. Символы, используемые в РВ (продолжение) Метасимволы
-
Метасимволы (специальные символы, обозначают диапазон литералов, например «цифры», «буквы латинского алфавита», «заглавные буквы», «видимые символы» и др.) \d - соответствует любая цифра от 0 до 9. \D - соответствует все, кроме цифры. \s - соответствует пробел. \S - соответствует все, кроме пробела. \w - соответствует буква, цифра или знак подчеркивания. \W - соответствует все, кроме буквы, цифры или знака подчеркивания. Например, шаблону /x\d\d/ будут соответствовать строки: "x01", "x25" и т.д., но не будут соответствовать строки: "A15", "x0A". Также обратный слэш используется, чтобы специальный символ сделать литеральным. Например, если нам нужно найти строку "a*b", то мы зададим следующий шаблон: /a\*b/. Символы, используемые в РВ (продолжение) Простой пример
-
ПРИМЕР 1
var par=/[0-9a-z]+/i; Здесь [0-9a-z]+ - шаблон, буквально означающий следующее «любое количество цифр и букв 1 и более раз» (как задавать шаблон посмотрим чуть ниже). i - флаг, означающий, что регистр символов не имеет значение. Сложный пример
-
ПРИМЕР 2
Предположим, что у нас есть форма, куда пользователь вводит свой e-mail и пароль. Мы хотим, чтобы при нажатии на кнопку «Зарегистрировать» осуществлялась проверка корректности ввода. Код html-страницы будет следующим:
Форма регистрации E-mail: Password: -
Итак, что же должна сделать функция prov_adress()? Для начала нам нужны две переменные, в которые мы поместим значения, введенные пользователем: function prov_adress(obj) { varadr=obj.mail.value; var par=obj.pas.value; } РВ для e-mailи пароля
-
Теперь нам нужно задать образцы (регулярные выражения), с которыми мы и будем сравнивать то, что ввел пользователь. Здесь я их просто приведу, о том, как их составлять, расскажу позже: function prov_adress(obj) { varadr=obj.mail.value; var par=obj.pas.value; varadr_pattern=/[0-9a-z_]+@[0-9a-z_]+\.[a-z]{2,5}/i; varpar_pattern=/[0-9a-z]+/i; } Метод test()
-
Теперь осуществляем проверку на сопоставление образцу. Для этого воспользуемся методом test() объекта RegExp: function prov_adress(obj) { varadr=obj.mail.value; var par=obj.pas.value; varadr_pattern=/[0-9a-z_]+@[0-9a-z_]+\.[a-z]{2,5}/i; varpar_pattern=/[0-9a-z]+/i; varprov=adr_pattern.test(adr); var prov1=par_pattern.test(par); } Результат проверки
-
Строка adr_pattern.test(adr) означает следующее: проверить существование в строке adr последовательности, сопоставляющейся с регулярным выражением adr_pattern. Метод test() возвращает логическое значение (true или false). Нам осталось только указать в нашей функции, что делать в случае успешной (или неуспешной) проверки: function prov_adress(obj) { varadr=obj.mail.value; var par=obj.pas.value; varadr_pattern=/[0-9a-z_]+@[0-9a-z_]+\.[a-z]{2,5}/i; varpar_pattern=/[0-9a-z]+/i; varprov=adr_pattern.test(adr); var prov1=par_pattern.test(par); if (prov==true && prov1==true) { alert("Вы зарегистрированы!"); } else { alert("Введенные данные некорректны!"); } } РВ для пароля
-
Прежде, чем проверить работу нашего сценария, посмотрим, из чего же состоят наши регулярные выражения. Возьмем регулярное выражение для нашего пароля - /[0-9a-z]+/i: /[0-9a-z]+/ - шаблон, в котором: 0-9 - любая цифра. a-z - любая строчная буква от a до z. [] - квадратные скобки означают, что в шаблоне может присутствовать любой из перечисленных в них литералов (в нашем случае цифры и строчные буквы) + - указывает, что данная часть шаблона (т.е. то, что в квадратных скобках) может повторяться один и более раз. i - флаг, означающий, что регистр символов не имеет значение. Иными словами, наше регулярное выражение указывает, что пароль может содержать любое количество цифр и букв 1 и более раз (т.е. он может состоять из одной цифры, из одной буквы, из многих цифр, из многих букв, из цифр и букв). Например, если пользователь введет в поле пароля "2", "a3b" или "leopard", то такой пароль будет считаться корректным. А если, он введет "ab&s" или "24?", то такой пароль корректным считаться не будет, т.к. он содержит спецсимволы, а мы их в регулярном выражении не разрешили. РВ для e-mail
-
Давайте, например, посмотрим, что же мы написали для шаблона e-mail в нашем примере: varadr_pattern=/[0-9a-z_]+@[0-9a-z_]+\.[a-z]{2,5}/i; Итак, мы указали, что в адресе электронной почты идут цифры, буквы и знаки подчеркивания 1 и более раз, затем следует символ @, затем снова идут цифры, буквы и знаки подчеркивания 1 и более раз, затем идет символ точки, после которой идут буквы от 2 до 5 раз. Примерно такой вид имеют адреса электронной почты. файл
-
Другие примеры РВ
Только цифра: varonly_num_pattern=/[0-9]/; Только латинская буква: varonly_lat_pattern=/[A-Za-z]/; Только русская буква: var only_rus_pattern=/[А-Яа-я]/; Только 5 символов:varonly_five_pattern=/[0-9A-Za-z]{5}/; Не менее n символов:varunless_than_n=/[0-9A-Za-z]{n,}/; Не более n символов:varnot_more_than_n=/[0-9A-Za-z]{0,n}/; От n до m символов:varfrom_n_to_m_pattern=/[0-9A-Za-z]{n,m}/;
-
ВСЁ
иллюстрации - Maria-van-Bruggen
-
Источники:
http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F http://blog.stevenlevithan.com/archives/regex-legends http://www.hq.nasa.gov/alsj/henry.html http://chernykh.net/content/view/261/460/ http://javascript.ru/RegExp Для валидаторов объектов, дополнительно - http://www.site-do.ru/js/js14.php
Нет комментариев для данной презентации
Помогите другим пользователям — будьте первым, кто поделится своим мнением об этой презентации.