18
Регулярни изрази Регулярни изрази Светлин Наков Георги Пенков Българска асоциация на разработчиците на софтуер www.devbg.org

Регулярни изрази

  • Upload
    jessie

  • View
    111

  • Download
    3

Embed Size (px)

DESCRIPTION

Регулярни изрази. Светлин Наков Георги Пенков. Българска асоциация на разработчиците на софтуер. www.devbg.org. Съдържание. Какво са регулярните изрази? Езикът на регулярните изрази Валидация чрез регулярни изрази Парсване на текст Замяна в текст Езици и платформи Полезни съвети - PowerPoint PPT Presentation

Citation preview

Page 1: Регулярни изрази

Регулярни изразиРегулярни изразиСветлин НаковГеорги Пенков

Светлин НаковГеорги Пенков

Българска асоциация на разработчиците на софтуерБългарска асоциация на разработчиците на софтуер

www.devbg.orgwww.devbg.org

Page 2: Регулярни изрази

СъдържаниеСъдържание

• Какво са регулярните изрази?Какво са регулярните изрази?

• Езикът на регулярните изразиЕзикът на регулярните изрази

• Валидация чрез регулярни изразиВалидация чрез регулярни изрази

• Парсване на текстПарсване на текст

• Замяна в текстЗамяна в текст

• Езици и платформиЕзици и платформи

• Полезни съветиПолезни съвети

• Връзки по тематаВръзки по темата

Page 3: Регулярни изрази

Какво са регулярните изрази?Какво са регулярните изрази?

• Мощно средство за обработка на текстМощно средство за обработка на текст

• Служат за:Служат за:

• Извличане на информация от текст по Извличане на информация от текст по зададен шаблон (зададен шаблон (regexp pattern)regexp pattern)

• Валидация на текстова информацияВалидация на текстова информация

• Променяне/изтриване на поднизове в Променяне/изтриване на поднизове в тексттекст

• Компактен синтаксисКомпактен синтаксис

Page 4: Регулярни изрази

Още за регулярните изразиОще за регулярните изрази

• Интуитивен подходИнтуитивен подход

• Спестяват време, усилия и код Спестяват време, усилия и код

• ЕфективниЕфективни

• Преобразуват се до крайни автомати Преобразуват се до крайни автомати ((Finite State Machine)Finite State Machine)

• Предпочитан избор при боравене с текстПредпочитан избор при боравене с текст

• ПоддържатПоддържат се от всевъзможни езици и се от всевъзможни езици и платформиплатформи

Page 5: Регулярни изрази

Какво е регулярен израз?Какво е регулярен израз?

• Регулярните изрази са специални символни Регулярните изрази са специални символни низове, които:низове, които:

• Дефинират шаблон определящ множество Дефинират шаблон определящ множество от низове (даден регулярен език)от низове (даден регулярен език)

• Използват специален Използват специален “regex” “regex” синтаксис за синтаксис за описанието на шаблонитеописанието на шаблоните

• Regex Regex синтаксисътсинтаксисът

• Еднакъв на всички платформи (с малки Еднакъв на всички платформи (с малки изключения)изключения)

• Производен на Производен на Perl Perl синтаксисасинтаксиса

Page 6: Регулярни изрази

Примери за рег. изразиПримери за рег. изрази

• Шаблон, описващ всички непразни низове, Шаблон, описващ всички непразни низове, които се състоят само от цифрите които се състоят само от цифрите 00 и и 11::

• Всички телефонни номера имащи формат Всички телефонни номера имащи формат 088XXXXXXX088XXXXXXX (където (където XX е цифра) е цифра)

• Име на домейн в Име на домейн в .bg.bg зоната зоната

[0-1]+

088[0-9]{7}

([A-Za-z0-9-]+\.)+bg

Page 7: Регулярни изрази

Езикът на регулярните изразиЕзикът на регулярните изрази

• Състои се от Състои се от литералилитерали и и метасимволиметасимволи

• ЛитералиЛитерали – константи, които задават точно – константи, които задават точно определен поднизопределен подниз

• МетасимволиМетасимволи – описват символни класове или – описват символни класове или задават специални правила в шаблоназадават специални правила в шаблона

• Класове от символи, напр. Класове от символи, напр. [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

Page 8: Регулярни изрази

Валидация на числа с Валидация на числа с .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); }}

Page 9: Регулярни изрази

Валидация на имена с Валидация на имена с PerlPerl

• Очакваме име и фамилия, на кирилица с главна Очакваме име и фамилия, на кирилица с главна начална букваначална буква, , напр. “Ангел Борисов“напр. “Ангел Борисов“

• Валидация на потребителско имеВалидация на потребителско име с дължина от 8 до 32 с дължина от 8 до 32 символа, съставено от латински букви, цифри и символа, съставено от латински букви, цифри и “_”“_” : :

$name = "Ангел Борисов";$pattern = '^([А-Я][а-я]+)\s([А-Я][а-я]+)$';if ($name =~ /$pattern/) { ... }

if ($username !~ /^[\w\d]{8,32}$/){ print "Invalid username!";}

Page 10: Регулярни изрази

Парсване на текст с Парсване на текст с .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"]);}

Page 11: Регулярни изрази

Заменяне на Заменяне на && с с &amp;&amp; с с PerlPerl

# Входът идва от STDIN, а изходът е към STDOUT

while (<STDIN>){ s/&(?![a-zA-Z]{2,6};|#[0-9]{3,5};)/&amp;/g; print;}

• Искаме да заменим всички символи Искаме да заменим всички символи && със със съответното им HTML entity: съответното им HTML entity: &amp;&amp;

• Задачата не е тривиална:Задачата не е тривиална:

• Не трябва да бъдат променяни съществуващи Не трябва да бъдат променяни съществуващи HTML entities (напр. HTML entities (напр. &quot;&quot; или или &#160&#160;;).).

Page 12: Регулярни изрази

Замяна на тагове с Замяна на тагове с .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);}

Page 13: Регулярни изрази

Тлъст, сложен, но пък пояснен Тлъст, сложен, но пък пояснен 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.*$/;

Page 14: Регулярни изрази

Езици и платформиЕзици и платформи

• Регулярни изрази се поддържат Регулярни изрази се поддържат навсякъде:навсякъде:

• PerlPerl

• .NET Framework (C#, VB.NET, …).NET Framework (C#, VB.NET, …)

• JavaJava

• PHPPHP

• JavaScriptJavaScript

• DelphiDelphi

• C, C++C, C++

Page 15: Регулярни изрази

Полезни съветиПолезни съвети

• Избягвайте Избягвайте сложнисложни регулярни изрази регулярни изрази

• Проверете дали някой вече не е писал Проверете дали някой вече не е писал регулярен израз за вашия проблемрегулярен израз за вашия проблем

• Решението може да е Решението може да е по-пълнопо-пълно от вашето от вашето

• Съществуват готови рег. изрази:Съществуват готови рег. изрази:

• Описващи Описващи URLURL адреси; адреси;

• За валидация на За валидация на ee--mail mail адреси;адреси;

• За проверка формата на За проверка формата на IPIP адреси; адреси;

• Много другиМного други

• Не се доверявайте – има и грешни!Не се доверявайте – има и грешни!

Page 16: Регулярни изрази

Полезни съветиПолезни съвети

• Разбивайте проблема на частиРазбивайте проблема на части

• Пишете по-прости регулярни изрази за Пишете по-прости регулярни изрази за всяка частвсяка част

• Пишете прегледни регулярни изрази Пишете прегледни регулярни изрази форматирани прегледно, ако трябва на форматирани прегледно, ако трябва на няколко реда няколко реда

• Пример: изваждане на всички изречения с Пример: изваждане на всички изречения с главни букви:главни букви:

1.1. Извадете изречениятаИзвадете изреченията

2.2. Проверете всяко дали е с главни буквиПроверете всяко дали е с главни букви

Page 17: Регулярни изрази

Връзки по тематаВръзки по темата

• 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

Page 18: Регулярни изрази

Регулярни изразиРегулярни изрази

Събудете се!Събудете се!

Въпроси?Въпроси?