Upload
svetlin-nakov
View
2.129
Download
0
Embed Size (px)
Citation preview
Регулярни изразиРегулярни изразиСветлин НаковГеорги Пенков
Светлин НаковГеорги Пенков
Българска асоциация на разработчиците на софтуерБългарска асоциация на разработчиците на софтуер
www.devbg.orgwww.devbg.org
СъдържаниеСъдържание
• Какво са регулярните изрази?Какво са регулярните изрази?
• Езикът на регулярните изразиЕзикът на регулярните изрази
• Валидация чрез регулярни изразиВалидация чрез регулярни изрази
• Парсване на текстПарсване на текст
• Замяна в текстЗамяна в текст
• Езици и платформиЕзици и платформи
• Полезни съветиПолезни съвети
• Връзки по тематаВръзки по темата
Какво са регулярните изрази?Какво са регулярните изрази?
• Мощно средство за обработка на текстМощно средство за обработка на текст
• Служат за:Служат за:
• Извличане на информация от текст по Извличане на информация от текст по зададен шаблон (зададен шаблон (regexp pattern)regexp pattern)
• Валидация на текстова информацияВалидация на текстова информация
• Променяне/изтриване на поднизове в Променяне/изтриване на поднизове в тексттекст
• Компактен синтаксисКомпактен синтаксис
Още за регулярните изразиОще за регулярните изрази
• Интуитивен подходИнтуитивен подход
• Спестяват време, усилия и код Спестяват време, усилия и код
• ЕфективниЕфективни
• Преобразуват се до крайни автомати Преобразуват се до крайни автомати ((Finite State Machine)Finite State Machine)
• Предпочитан избор при боравене с текстПредпочитан избор при боравене с текст
• ПоддържатПоддържат се от всевъзможни езици и се от всевъзможни езици и платформиплатформи
Какво е регулярен израз?Какво е регулярен израз?
• Регулярните изрази са специални символни Регулярните изрази са специални символни низове, които:низове, които:
• Дефинират шаблон определящ множество Дефинират шаблон определящ множество от низове (даден регулярен език)от низове (даден регулярен език)
• Използват специален Използват специален “regex” “regex” синтаксис за синтаксис за описанието на шаблонитеописанието на шаблоните
• Regex Regex синтаксисътсинтаксисът
• Еднакъв на всички платформи (с малки Еднакъв на всички платформи (с малки изключения)изключения)
• Производен на Производен на Perl Perl синтаксисасинтаксиса
Примери за рег. изразиПримери за рег. изрази
• Шаблон, описващ всички непразни низове, Шаблон, описващ всички непразни низове, които се състоят само от цифрите които се състоят само от цифрите 00 и и 11::
• Всички телефонни номера имащи формат Всички телефонни номера имащи формат 088XXXXXXX088XXXXXXX (където (където XX е цифра) е цифра)
• Име на домейн в Име на домейн в .bg.bg зоната зоната
[0-1]+
088[0-9]{7}
([A-Za-z0-9-]+\.)+bg
Езикът на регулярните изразиЕзикът на регулярните изрази
• Състои се от Състои се от литералилитерали и и метасимволиметасимволи
• ЛитералиЛитерали – константи, които задават точно – константи, които задават точно определен поднизопределен подниз
• МетасимволиМетасимволи – описват символни класове или – описват символни класове или задават специални правила в шаблоназадават специални правила в шаблона
• Класове от символи, напр. Класове от символи, напр. [a-zA-Z][a-zA-Z], , \w\w, , \W\W, , \d\d, , \s\s
• За количество (quantifiers), напр. За количество (quantifiers), напр. **, , ++, , {8,10}{8,10}
• За местоположение, напр. За местоположение, напр. \b\b, , \A\A, , \z\z, , ^̂, , $$
• За алтернативен избор – За алтернативен избор – || (логическо "или") (логическо "или")
• За групиране – За групиране – ((, , )), напр. , напр. ([0-9]+)([0-9]+)
• Escaping последователности, напр. Escaping последователности, напр. \*\* , , \n\n
Валидация на числа с Валидация на числа с .NET.NET
using System;using System.Text.RegularExpressions;
public class RegExSample{ static void Main(string[] args) { string s = "1234"; string pattern = @"\A[1-9][0-9]*\z"; if (Regex.IsMatch(s, pattern)) Console.WriteLine("{0} is valid number", s); else Console.WriteLine("Invalid number: {0}", s); }}
Валидация на имена с Валидация на имена с PerlPerl
• Очакваме име и фамилия, на кирилица с главна Очакваме име и фамилия, на кирилица с главна начална букваначална буква, , напр. “Ангел Борисов“напр. “Ангел Борисов“
• Валидация на потребителско имеВалидация на потребителско име с дължина от 8 до 32 с дължина от 8 до 32 символа, съставено от латински букви, цифри и символа, съставено от латински букви, цифри и “_”“_” : :
$name = "Ангел Борисов";$pattern = '^([А-Я][а-я]+)\s([А-Я][а-я]+)$';if ($name =~ /$pattern/) { ... }
if ($username !~ /^[\w\d]{8,32}$/){ print "Invalid username!";}
Парсване на текст с Парсване на текст с .NET.NET
• Даден е текст във формат:Даден е текст във формат:
• Използваме регулярни изрази и групи:Използваме регулярни изрази и групи:
<име на потребител> <IP адрес> <време в системата>
String text = "root 193.168.22.18 22:12:38\n" + "nakov 217.9.231.126 00:07:24";string pattern = @"(?<name>\S+)\s+(?<ip>[0-9\.]+)\s+(?<time>[0-9:]+)";MatchCollection matches = Regex.Matches(text, pattern);foreach (Match m in matches){ Console.WriteLine("name={0,-8} ip={1,-16} time={2}", m.Groups["name"], m.Groups["ip"], m.Groups["time"]);}
Заменяне на Заменяне на && с с && с с PerlPerl
# Входът идва от STDIN, а изходът е към STDOUT
while (<STDIN>){ s/&(?![a-zA-Z]{2,6};|#[0-9]{3,5};)/&/g; print;}
• Искаме да заменим всички символи Искаме да заменим всички символи && със със съответното им HTML entity: съответното им HTML entity: &&
• Задачата не е тривиална:Задачата не е тривиална:
• Не трябва да бъдат променяни съществуващи Не трябва да бъдат променяни съществуващи HTML entities (напр. HTML entities (напр. "" или или   ;).).
Замяна на тагове с Замяна на тагове с .NET.NET
• Да се заменят таговете Да се заменят таговете [URL=…] … [/URL][URL=…] … [/URL] с с HTML хипервръзки HTML хипервръзки <a href = …> … </a><a href = …> … </a>::
static void Main(){ String text = "Here is the link with logo:<br>" + "[URL=http://www.devbg.org][IMG]\n" + "http://www.devbg.org/logo.gif[/IMG][/URL]\n"; string pattern = @"\[URL=(?<url>[^\]]+)\]" + @"(?<content>(.|\s)*?)\[/URL\]"; string newPattern = "<a href=\"${url}\">${content}</a>"; string newText = Regex.Replace(text, pattern, newPattern); Console.WriteLine(newText);}
Тлъст, сложен, но пък пояснен Тлъст, сложен, но пък пояснен regexp примерregexp пример
Da teeeeesttt sux 1000000 (million) timesssss
^ $
(е+)
([\D\s]+)
.+? (\d{5,10}\s) (.*)
i
.*?
s
.*
$1 $2 $3 $4
#!/usr/bin/perl$a ='Da teeeeesttt sux 1000000 (million) timesssss ';$a =~ /^.+?(e+)([\D\s]+)(\d{5,10}\s)(.*)i.*?s.*$/;
Езици и платформиЕзици и платформи
• Регулярни изрази се поддържат Регулярни изрази се поддържат навсякъде:навсякъде:
• PerlPerl
• .NET Framework (C#, VB.NET, …).NET Framework (C#, VB.NET, …)
• JavaJava
• PHPPHP
• JavaScriptJavaScript
• DelphiDelphi
• C, C++C, C++
Полезни съветиПолезни съвети
• Избягвайте Избягвайте сложнисложни регулярни изрази регулярни изрази
• Проверете дали някой вече не е писал Проверете дали някой вече не е писал регулярен израз за вашия проблемрегулярен израз за вашия проблем
• Решението може да е Решението може да е по-пълнопо-пълно от вашето от вашето
• Съществуват готови рег. изрази:Съществуват готови рег. изрази:
• Описващи Описващи URLURL адреси; адреси;
• За валидация на За валидация на ee--mail mail адреси;адреси;
• За проверка формата на За проверка формата на IPIP адреси; адреси;
• Много другиМного други
• Не се доверявайте – има и грешни!Не се доверявайте – има и грешни!
Полезни съветиПолезни съвети
• Разбивайте проблема на частиРазбивайте проблема на части
• Пишете по-прости регулярни изрази за Пишете по-прости регулярни изрази за всяка частвсяка част
• Пишете прегледни регулярни изрази Пишете прегледни регулярни изрази форматирани прегледно, ако трябва на форматирани прегледно, ако трябва на няколко реда няколко реда
• Пример: изваждане на всички изречения с Пример: изваждане на всички изречения с главни букви:главни букви:
1.1. Извадете изречениятаИзвадете изреченията
2.2. Проверете всяко дали е с главни буквиПроверете всяко дали е с главни букви
Връзки по тематаВръзки по темата
• http://en.wikipedia.org/wiki/Regular_expressionhttp://en.wikipedia.org/wiki/Regular_expressionЩо е то Що е то Regular ExpressionRegular Expression според според WikipediaWikipedia
• http://www.regexlib.com/http://www.regexlib.com/Библиотека с готови регулярни изрази (понастоящем Библиотека с готови регулярни изрази (понастоящем над 1000)над 1000)
• http://regex.osherove.com/http://regex.osherove.com/The Regulator – The Regulator – безплатен инструмент за създаване и безплатен инструмент за създаване и тестване на регулярни изразитестване на регулярни изрази
• http://perl.plover.com/Regex/http://perl.plover.com/Regex/Как работи Как работи regexregex машината – с картинки и примери машината – с картинки и примери
• http://www.weitz.de/regex-coach/http://www.weitz.de/regex-coach/The Regex CoachThe Regex Coach
Регулярни изразиРегулярни изрази
Събудете се!Събудете се!
Въпроси?Въпроси?