Lesson #18. String type and regular expressions

Theory

Lecture in pdf format

Char type

c: char;
...
c:='a';
begin
var c: char;
c:='a';
Println(c.IsDigit); // False 
Println(c.IsLetter); // True 
Println(c.IsLower); // True
Println(c.IsUpper); // False 
Println(c.IsPunctuation); // знак препинания, boolean
 
с := char.ToLower(с) ;
с := char.ToUpper(с); 
end.
Операции для типа char
c1 < c2;// сравнение по коду
c1 > c2;
с in ['a','e','i','o','u',’y’]; // c принадлежит гласным
с in ['a'..'z','A'..'Z’]; // c принадлежит английским буквам
Задание:
Запросите ввести два символа. Определите, принадлежат ли символы английским буквам, и если да, то гласные ли это буквы. Преобразуйте в верхний регистр ту букву, код которой меньше.

Пример вывода:

Введите два символа:
u z
u - английская буква, гласная
z - английская буква, не гласная
Буква u в верхнем регистре U

String type

s: string;
...
s:='abc';
begin
var s: string;
s:='Abc';
Println(s.ToLower); // abc 
Println(s.ToUpper); // ABC 
end.

Slices of the strings:

begin
var s: string;
s:='12345678';
Println(s[3:6]); // 345 
Println(s[::-1]); // 87654321 
end.

String methods:
Сonversion string <-> number:

begin
var s: string;
s:='12345678';
var i:=1;
Println(i.ToString); // string '1'
Println(s.ToInteger); // number 12345678 
Println(s.ToReal); // number 12345678 
end.

or

begin
var s: string;
s:='12345678';
var i:=1;
Println(integer.TryParse(s,i)); // is it possible to convert s to a number - True 
end.

Сonversion of a string to an array of words:

begin
var s:='it is a piece of cake';
var ss:=s.ToWords.Println('_'); // it_is_a_piece_of_cake
ss.Sorted.Println // a cake of piece is it
end.

Sample: remove all «i» letters:

begin
var s:='it is a piece of cake';
s:=s.Where(c -> c<>'i').JoinIntoString;
print(s); // t s a pece of cake 
end.

While working with strings we can use any sequence method

Reguglar expressions

Язык регулярных выражений — это язык шаблонов, расширенные операции поиска и замены для строк.

Основной цикл:

s := 'red  green  gray blue';
foreach var m in s.Matches('\w+') do
  Print(m.Value, m.Index);

Т.е. m: Match включает m.Value, m.Index
Опции регулярных выражений:

s := 'AБракадабРА';
s.Matches('бра', RegexOptions.IgnoreCase)

Примеры регулярных выражений:
‘кот|кит’ ‘к[ио]т’ ‘к[а-я]т’ ‘ко+т’ ‘кор?т’ ‘к.т’ ‘к\.т’ ‘к.*т’
‘ко{3}т’ ‘ко{2,4}т’ ‘ко[^ъыь]т’ ‘\b кот\b’

Управляющие символы и их запись в регулярных выражениях:
\ * + ? | { [ ( ) ^ $ . #
Они экранируются дополнительным \

Квантификаторы:
* — 0 или более повторений
+ — 1 или более повторений
? — 0 или 1 повторение
{N} — ровно N повторений
{N,} — не менее N повторений
{N,M} — от N до M повторений

Директивы нулевой длины:
^ — начало строки
$ — конец строки
\b — позиция на границе слова

Классы символов:
[abcd] — один из символов, указанных в списке
[^abcd] — любой из символов, кроме тех, которые указаны в списке
[a-d] — один из символов, лежащих в указанном диапазоне
[^a-d] — любой из символов, кроме тех, которые лежат в указанном диапазоне
\d — десятичная цифра: [0-9]
\D — любой символ, кроме десятичной цифры
\w — буква, цифра или символ подчеркивания
\W — любой символ, не являющийся словообразующим;
\s — пробельный символ, т. е. [ \t\r\n];
\S — любой непробельный символ;
. — любой символ

Группы:

s := ' prepod@sfedu.ru   prepod2@sfedu.ru ';
foreach var m in s.Matches('(\w+)@(\w+).(\w+)') do
  Println(m.Groups[0], m.Groups[1], m.Groups[2], m.Groups[3]); 
s.Matches('(т[оае])\1*')

Замена с помощью регулярного выражения:

s.Replace('\b\w+\b', '<$0>')
s := s.Replace('\w+',m->m.Value.ToUpper);
s := s.Replace('\w+',m->m.Value+'('+m.Length+')')
s := '10+2=12';
s.Replace('\d+', '<$0>') // <10>+<2>=<12>
s.Replace('\d+', m -> (m.Value.ToInteger*2).ToString) // 20+4=24
 
s := ' prepod@sfedu.ru   prepod2@sfedu.ru ';
s.Replace('(\w+)@(\w+).(\w+)', '$1-$2-$3')