Delphi. Урок 13. Работа со строками

Уроки для начинающих   4 Май 2012  Автор статьи: admin 

В этом уроке мы более подробно разберем различные методы работы со строками. Научимся производить простые операции копирования, поиска, вставки и т.п.
В прошлом уроке мы рассмотрели достаточно полезные функции преобразования чисел в строки и наоборот. Теперь давайте рассмотрим несколько функций работы непосредственно с самими строками.

Сложение строк (операция конкатенации)

Сложение строк реализуется практически как и сложение обыкновенных чисел следующим образом:

1
2
3
4
5
6
7
8
var
  a,b,c:string;
begin
  b := 'Cybern.ru';
  c := ' is a best website';
  a := b + c;
  // в результате строка a будет выглядеть так: "Cybern.ru is a best website"
end;
Получение длины строки

Получение длины строки в Delphi реализуется при помощи функции Length, которая возвращает в качестве результата целочисленное число.

1
2
3
4
5
6
7
8
var
  a:string;
  count:integer;
begin
  a := 'Cybern.ru'; // 9 символов
  count := Length(a);
  // в результате переменная count будет равна 9
end;
Строка как массив

В любой строке можно получать доступ к каждому ее символу. Таким образом, можно рассматривать строку как одномерный массив символов, т.е. можно обращаться к каждому символу по его индексу. Важно учесть, что индексы в строках типа String нумеруются не с 0, а c 1, т.е. индекс первого символа равен 1, а индекс последнего символа равен Length(s) (длине этой строки).

1
2
3
4
5
6
7
8
9
var
  a, b:string;
  c: char;
begin
  a := 'Cybern.ru'; // 9 символов
  b := a[3]; // символ 'b'
  c := a[3]; // можно использовать тип Char, который хранит в себе не более 1 символа
  c := a[length(a)]; // получение последнего символа 'u'
end;
Преобразование строки к нижнему и верхнему регистру
1
2
3
4
5
6
7
var
  a, b:string;
begin
  a := 'CyberN.RU';
  b := LowerCase(a); // строка b будет равна 'cybern.ru'
  b := UpperCase(a); // строка b будет равна 'CYBERN.RU'
end;
Поиск в строке

Для поиска позиции определенной подстроки в строке используется функция Pos, возвращающая в результате своего вхождения начальный индекс этого вхождения в строке. Этой функции необходимо передать два параметра: подстроку, которую ищем, и строку, в которой производим поиск. Рассмотрим простой пример.

1
2
3
4
5
6
7
8
var
  a, b:string;
  с: integer;
begin
  a := 'CyberN.RU is the best website about programming';
  b := 'website';
  c := pos(b, a); // c = 23
end;

Также существует еще одна аналогия функции pos, но имеющая немного больше возможностей — PosEx. Она позволяет производить поиск подстроки начиная с определенного индекса в строке. Но для работы с этой функцией необходимо добавить в раздел uses модуль StrUtils.

1
2
3
4
5
6
7
8
var
  a, b:string;
  с: integer;
begin
  a := '123abc123123123';
  b := '123';
  c := PosEx(b, a, 4); // c = 7
end;

Как видите, преимущество PosEx заключается в том, что при поиске можно игнорировать определенные вхождения до указанного индекса. Это бывает очень удобно.

Вставка одной строки внутрь другой

Функция Insert позволяет вставить подстроку внутрь исходной строки, начиная с указанного индекса. При этом вставка происходит со сдвигом последующих символов вправо на длину вставляемой подстроки.

1
2
3
4
5
6
7
var
  a, b:string;
begin
  a := 'CyberN.RU is the website about programming';
  b := 'best ';
  Insert(a, b, 13); // a = "CyberN.RU is the best website about programming"
end;
Удаление подстроки из строки

Процедура Delete позволяет удалить из строки указанное количество символов, начиная с указанного индекса в строке. При этом удаление происходит со сдвигом последующих символов на длину удаляемой подстроки влево.

1
2
3
4
5
6
var
  a:string;
begin
  a := '123123abc123123';
  Delete(a, 7, 3); // a = "123123123123"
end;
Копирование подстроки из строки

Функция Copy позволяет получить дубликат подстроки определенной длинны, начинающейся с символа с указанным индексом.

1
2
3
4
5
6
var
  a, b:string;
begin
  a := 'cybern.ru is the best website about programming';
  b := Copy(a, 1, 9); // b = "cybern.ru"
end;
Замена одной подстроки на другую подстроку внутри строки

Для замены одной подстроки на другую подстроку внутри исходной строки используют функцию StringReplace. Нужно признать, что функция довольно удобная и обойти стороной ее никак нельзя. Довольно полезной возможностью этой функции является то, что она может заменять сразу несколько вхождений одной подстроки на другую, а также может игнорировать регистр. Последние две возможности являются опциональными (необязательными) и при необходимости их можно не использовать. Рассмотрим пример:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var
  a, b, c: string;
begin
  a := 'aBc Abc abC 123 cba cba cba'; // исходная строка
  b := 'abc'; // заменяемая подстрока
  c := 'test'; // заменяющая подстрока
  // Далее параметр [rfReplaceAll,rfIgnoreCase] обозначают как раз те самые опции в работе функции.
  // Называются такие параметры "флагами".
  // Такие флаги обязательно нужно указывать внутри квадратных скобок.
  // Сами флаги перечисляются через запятую.
  // Все флаги, находящиеся внутри квадратных скобок являются обычным параметром функции.
  // Флаг rfReplaceAll говорит функции, что нужно будет производить замену всех вхождений.
  // Если этот флаг убрать (тогда выглядеть флаги будут так "[rfIgnoreCase]"),
  // то заменится только первое вхождение в строке a.
  // Флаг rfIgnoreCase указывает, что при поиске вхождений строк b регистр учитываться не будет.
  // Если все флаги вам не нужны, то это НЕ значит, что параметр вовсе не нужно указывать.
  // В таком случае укажите в качестве флагов "[]".
  a := StringReplace(a,b,c, [rfReplaceAll,rfIgnoreCase]);
  // В результате строка a будет содержать "test test test 123 cba cba cba"
end;

[note]Если вы не помните какие флаги есть у функции, то лучше укажите сначала «[«, а затем нажмите «Ctrl+Пробел», после чего откроется список с подсказками, в котором будут перечислены все возможные флаги. [/note]

Регулярные выражения

Регулярные выражения позволяют осуществлять очень широкий спектр различных возможностей, связанный с поиском, выбором и анализом строки. Подробнее о регулярных выражениях вы можете прочитать тут.

  • Shamil Gabaev

    поможешь?? Строка состоит из слов, разделенных одним или несколькими пробелами. Переставьте слова в алфавитном порядке

    • cyka

      помогу. ты сука

  • Lighning

    Пример для процедуры Insert не корректный. Правильно пишется Insert(b,a,13). Только что проверял

Научиться программировать

  • на Delphi

  • на Java

  • на C++