HHIDE_DUMP
Гость
H
HHIDE_DUMP
Гость
В этом уроке мы более подробно разберем различные методы работы со строками. Научимся производить простые операции копирования, поиска, вставки и т.п.
Теперь давайте рассмотрим несколько функций работы непосредственно с самими строками.
Сложение строк (операция конкатенации)
Сложение строк реализуется практически как и сложение обыкновенных чисел следующим образом:
1 var
2 a,b,c:string;
3 begin
4 b := 'zhk.su';
5 c := ' is a best website';
6 a := b + c;
7 // в результате строка a будет выглядеть так: "zhk.su is a best website"
8 end;
Получение длины строки
Получение длины строки в Delphi реализуется при помощи функции Length, которая возвращает в качестве результата целочисленное число.
1 var
2 a:string;
3 count:integer;
4 begin
5 a := 'zhk.su';
6 count := Length(a);
7 // в результате переменная count будет равна 6
8 end;
Строка как массив
В любой строке можно получать доступ к каждому ее символу. Таким образом, можно рассматривать строку как одномерный массив символов, т.е. можно обращаться к каждому символу по его индексу. Важно учесть, что индексы в строках типа String нумеруются не с 0, а c 1, т.е. индекс первого символа равен 1, а индекс последнего символа равен Length(s) (длине этой строки).
1 var
2 a, b:string;
3 c: char;
4 begin
5 a := 'zhk.su';
6 b := a[3]; // символ 'b'
7 c := a[3]; // можно использовать тип Char, который хранит в себе не более 1 символа
8 c := a[length(a)]; // получение последнего символа 'u'
9 end;
Преобразование строки к нижнему и верхнему регистру
1 var
2 a, b:string;
3 begin
4 a := 'zhk.su';
5 b := LowerCase(a); // строка b будет равна 'zhk.su'
6 b := UpperCase(a); // строка b будет равна 'zhk.su'
7 end;
Поиск в строке
Для поиска позиции определенной подстроки в строке используется функция Pos, возвращающая в результате своего вхождения начальный индекс этого вхождения в строке. Этой функции необходимо передать два параметра: подстроку, которую ищем, и строку, в которой производим поиск. Рассмотрим простой пример.
1 var
2 a, b:string;
3 с: integer;
4 begin
5 a := 'zhk.su is the best website about programming';
6 b := 'website';
7 c := pos(b, a); // c = 23
8 end;
Также существует еще одна аналогия функции pos, но имеющая немного больше возможностей — PosEx. Она позволяет производить поиск подстроки начиная с определенного индекса в строке. Но для работы с этой функцией необходимо добавить в раздел uses модуль StrUtils.
1 var
2 a, b:string;
3 с: integer;
4 begin
5 a := '123abc123123123';
6 b := '123';
7 c := PosEx(b, a, 4); // c = 7
8 end;
Как видите, преимущество PosEx заключается в том, что при поиске можно игнорировать определенные вхождения до указанного индекса. Это бывает очень удобно.
Вставка одной строки внутрь другой
Функция Insert позволяет вставить подстроку внутрь исходной строки, начиная с указанного индекса. При этом вставка происходит со сдвигом последующих символов вправо на длину вставляемой подстроки.
1 var
2 a, b:string;
3 begin
4 a := 'zhk.su is the website about programming';
5 b := 'best ';
6 Insert(a, b, 13); // a = "zhk.su is the best website about programming"
7 end;
Удаление подстроки из строки
Процедура Delete позволяет удалить из строки указанное количество символов, начиная с указанного индекса в строке. При этом удаление происходит со сдвигом последующих символов на длину удаляемой подстроки влево.
1 var
2 a:string;
3 begin
4 a := '123123abc123123';
5 Delete(a, 7, 3); // a = "123123123123"
6 end;
Копирование подстроки из строки
Функция Copy позволяет получить дубликат подстроки определенной длинны, начинающейся с символа с указанным индексом.
1 var
2 a, b:string;
3 begin
4 a := 'zhk.su is the best website about programming';
5 b := Copy(a, 1, 9); // b = "zhk.su"
6 end;
Замена одной подстроки на другую подстроку внутри строки
Для замены одной подстроки на другую подстроку внутри исходной строки используют функцию StringReplace. Нужно признать, что функция довольно удобная и обойти стороной ее никак нельзя. Довольно полезной возможностью этой функции является то, что она может заменять сразу несколько вхождений одной подстроки на другую, а также может игнорировать регистр. Последние две возможности являются опциональными (необязательными) и при необходимости их можно не использовать. Рассмотрим пример:
1 var
2 a, b, c: string;
3 begin
4 a := 'aBc Abc abC 123 cba cba cba'; // исходная строка
5 b := 'abc'; // заменяемая подстрока
6 c := 'test'; // заменяющая подстрока
7 // Далее параметр [rfReplaceAll,rfIgnoreCase] обозначают как раз те самые опции в работе функции.
8 // Называются такие параметры "флагами".
9 // Такие флаги обязательно нужно указывать внутри квадратных скобок.
10 // Сами флаги перечисляются через запятую.
11 // Все флаги, находящиеся внутри квадратных скобок являются обычным параметром функции.
12 // Флаг rfReplaceAll говорит функции, что нужно будет производить замену всех вхождений.
13 // Если этот флаг убрать (тогда выглядеть флаги будут так "[rfIgnoreCase]"),
14 // то заменится только первое вхождение в строке a.
15 // Флаг rfIgnoreCase указывает, что при поиске вхождений строк b регистр учитываться не будет.
16 // Если все флаги вам не нужны, то это НЕ значит, что параметр вовсе не нужно указывать.
17 // В таком случае укажите в качестве флагов "[]".
18 a := StringReplace(a,b,c, [rfReplaceAll,rfIgnoreCase]);
19 // В результате строка a будет содержать "test test test 123 cba cba cba"
20 end;
Теперь давайте рассмотрим несколько функций работы непосредственно с самими строками.
Сложение строк (операция конкатенации)
Сложение строк реализуется практически как и сложение обыкновенных чисел следующим образом:
1 var
2 a,b,c:string;
3 begin
4 b := 'zhk.su';
5 c := ' is a best website';
6 a := b + c;
7 // в результате строка a будет выглядеть так: "zhk.su is a best website"
8 end;
Получение длины строки
Получение длины строки в Delphi реализуется при помощи функции Length, которая возвращает в качестве результата целочисленное число.
1 var
2 a:string;
3 count:integer;
4 begin
5 a := 'zhk.su';
6 count := Length(a);
7 // в результате переменная count будет равна 6
8 end;
Строка как массив
В любой строке можно получать доступ к каждому ее символу. Таким образом, можно рассматривать строку как одномерный массив символов, т.е. можно обращаться к каждому символу по его индексу. Важно учесть, что индексы в строках типа String нумеруются не с 0, а c 1, т.е. индекс первого символа равен 1, а индекс последнего символа равен Length(s) (длине этой строки).
1 var
2 a, b:string;
3 c: char;
4 begin
5 a := 'zhk.su';
6 b := a[3]; // символ 'b'
7 c := a[3]; // можно использовать тип Char, который хранит в себе не более 1 символа
8 c := a[length(a)]; // получение последнего символа 'u'
9 end;
Преобразование строки к нижнему и верхнему регистру
1 var
2 a, b:string;
3 begin
4 a := 'zhk.su';
5 b := LowerCase(a); // строка b будет равна 'zhk.su'
6 b := UpperCase(a); // строка b будет равна 'zhk.su'
7 end;
Поиск в строке
Для поиска позиции определенной подстроки в строке используется функция Pos, возвращающая в результате своего вхождения начальный индекс этого вхождения в строке. Этой функции необходимо передать два параметра: подстроку, которую ищем, и строку, в которой производим поиск. Рассмотрим простой пример.
1 var
2 a, b:string;
3 с: integer;
4 begin
5 a := 'zhk.su is the best website about programming';
6 b := 'website';
7 c := pos(b, a); // c = 23
8 end;
Также существует еще одна аналогия функции pos, но имеющая немного больше возможностей — PosEx. Она позволяет производить поиск подстроки начиная с определенного индекса в строке. Но для работы с этой функцией необходимо добавить в раздел uses модуль StrUtils.
1 var
2 a, b:string;
3 с: integer;
4 begin
5 a := '123abc123123123';
6 b := '123';
7 c := PosEx(b, a, 4); // c = 7
8 end;
Как видите, преимущество PosEx заключается в том, что при поиске можно игнорировать определенные вхождения до указанного индекса. Это бывает очень удобно.
Вставка одной строки внутрь другой
Функция Insert позволяет вставить подстроку внутрь исходной строки, начиная с указанного индекса. При этом вставка происходит со сдвигом последующих символов вправо на длину вставляемой подстроки.
1 var
2 a, b:string;
3 begin
4 a := 'zhk.su is the website about programming';
5 b := 'best ';
6 Insert(a, b, 13); // a = "zhk.su is the best website about programming"
7 end;
Удаление подстроки из строки
Процедура Delete позволяет удалить из строки указанное количество символов, начиная с указанного индекса в строке. При этом удаление происходит со сдвигом последующих символов на длину удаляемой подстроки влево.
1 var
2 a:string;
3 begin
4 a := '123123abc123123';
5 Delete(a, 7, 3); // a = "123123123123"
6 end;
Копирование подстроки из строки
Функция Copy позволяет получить дубликат подстроки определенной длинны, начинающейся с символа с указанным индексом.
1 var
2 a, b:string;
3 begin
4 a := 'zhk.su is the best website about programming';
5 b := Copy(a, 1, 9); // b = "zhk.su"
6 end;
Замена одной подстроки на другую подстроку внутри строки
Для замены одной подстроки на другую подстроку внутри исходной строки используют функцию StringReplace. Нужно признать, что функция довольно удобная и обойти стороной ее никак нельзя. Довольно полезной возможностью этой функции является то, что она может заменять сразу несколько вхождений одной подстроки на другую, а также может игнорировать регистр. Последние две возможности являются опциональными (необязательными) и при необходимости их можно не использовать. Рассмотрим пример:
1 var
2 a, b, c: string;
3 begin
4 a := 'aBc Abc abC 123 cba cba cba'; // исходная строка
5 b := 'abc'; // заменяемая подстрока
6 c := 'test'; // заменяющая подстрока
7 // Далее параметр [rfReplaceAll,rfIgnoreCase] обозначают как раз те самые опции в работе функции.
8 // Называются такие параметры "флагами".
9 // Такие флаги обязательно нужно указывать внутри квадратных скобок.
10 // Сами флаги перечисляются через запятую.
11 // Все флаги, находящиеся внутри квадратных скобок являются обычным параметром функции.
12 // Флаг rfReplaceAll говорит функции, что нужно будет производить замену всех вхождений.
13 // Если этот флаг убрать (тогда выглядеть флаги будут так "[rfIgnoreCase]"),
14 // то заменится только первое вхождение в строке a.
15 // Флаг rfIgnoreCase указывает, что при поиске вхождений строк b регистр учитываться не будет.
16 // Если все флаги вам не нужны, то это НЕ значит, что параметр вовсе не нужно указывать.
17 // В таком случае укажите в качестве флагов "[]".
18 a := StringReplace(a,b,c, [rfReplaceAll,rfIgnoreCase]);
19 // В результате строка a будет содержать "test test test 123 cba cba cba"
20 end;