08. Регулярни изрази, част 1

08. Регулярни изрази, част 1

08. Регулярни изрази, част 1

8 ноември 2011

Днес

Традиционната задача

за тези от вас, които се чувстват комфортно с РИ

Имаме следната задача:

Да се напише кратък Ruby expression, който проверява дали дадено число е просто или не, посредством употреба на регулярен израз. Резултатът от изпълнението му трябва да е true за прости числа и false за всички останали. Неща, които можете да ползвате:
  • Самото число, разбира се.
  • Произволни методи от класа Regexp
  • Подходящ регулярен израз (шаблон)
  • Текстовия низ '1'.
  • String#*.
  • Някакъв условен оператор (например if-else или ? … : …)
  • true, false, ...

Материалът, необходим за решаването й, ще го има изцяло в днешната лекция.

Нетрадиционната задача

за тези от вас, които вече ни знаят номерата

Имаме следната задача:

Да валидирате изрази от следния тип за правилно отворени/затворени скоби:
  • (car (car (car ...)))
  • Например: (car (car (car (car list))))
  • Целта е израз, чийто резултат да може да се ползва в условен оператор (true/false-еквивалент)
  • Можете да ползвате произволни методи от класа Regexp
  • И регулярен израз, разбира се

Примерно решение — на някоя от следващите сбирки.

Произход

малко обща култура

Проблемна област

най-общо: работа с текстови низове

Понятия

и терминология

РИ в Ruby

синтаксис, накратко

Regexp#match

ще го ползваме в примерите

Шаблони

(регулярни изрази, patterns и т.н.)

Най-прост пример

/find me/.match 'Can you find me in this long sentence?'  # #<MatchData "find me">
/find me/.match 'I am not here and you will not find ME!' # nil

Специални символи

meta characters

/day|nice/.match  'A nice dance-day.'  # #<MatchData "nice">
/da(y|n)ce/.match 'A nice dance-day.'  # #<MatchData "dance" 1:"n">

Внимавайте с приоритета на |

Екраниране

на специалните символи (escape-ване)

Класове от символи

(character classes)

Примери с класове от символи

/W[aeiou]rd/.match "Word" # #<MatchData "Word">
/[0-9a-f]/.match '9f'     # #<MatchData "9">
/[9f]/.match     '9f'     # #<MatchData "9">
/[^a-z]/.match   '9f'     # #<MatchData "9">

Предефинирани класове от символи

POSIX-класове от символи

Полезни не-POSIX класове

Символни свойства

character properties

/\s\p{Cyrillic}\p{Cyrillic}\p{Cyrillic}/.match 'Ние сме на всеки километър!' # #<MatchData " сме"># ~> -:1: invalid character property name {Cyrillic}: /\s\p{Cyrillic}\p{Cyrillic}\p{Cyrillic}/
# ~> -:1: invalid multibyte char (US-ASCII)
# ~> -:1: invalid multibyte char (US-ASCII)

Котви

Примери с котви

/real/.match "surrealist"    # #<MatchData "real">
/\Areal/.match "surrealist"  # nil
/\band/.match "Demand"       # nil

/\Band.+/.match "Supply and demand curve" # #<MatchData "and curve">

Повторители

(quantifiers)

Примери с повторители

/e+/.match     'Keeewl'       # #<MatchData "eee">
/[Kke]+/.match 'Keeewl'       # #<MatchData "Keee">
/\w+/.match '2038 - the year' # #<MatchData "2038">
/".*"/.match '"Quoted text!"' # #<MatchData "\"Quoted text!\"">

/[[:upper:]]+[[:lower:]]+l{2}o/.match 'Hello' # #<MatchData "Hello">

Алчност

/<.+>/.match("<a><b>")  # #<MatchData "<a><b>">
/<.+?>/.match("<a><b>") # #<MatchData "<a>">

Групи

и прихващане

Символите ( и ) се използват за логическо групиране на части от шаблона с цел:

Референции към групи

Текстът, който match-ва частта на шаблона, оградена в скоби, може да се достъпва:

Решение на проблема, поставен днес

проверка за просто число с РИ

Следва продължение

Остават още интересни неща за регулярните изрази, част от които ще разгледаме на една от следващите сбирки.

Въпроси