Строки


Предыдущая страница
Следующая страница  

D предоставляет следующие два типа строковых представлений:

Массив символов

Мы можем представить массив символов в одной из двух форм, как показано ниже. В первой форме размер указан напрямую, а во второй форме используется метод dup, который создаёт перезаписываемую копию строки "Доброе утро".

char[21]  greeting1 = "Всем привет"; 
char[] greeting2 = "Доброе утро".dup; 

Пример

Вот простой пример, использующий приведённые выше простые формы массива символов.

import std.stdio;

void main(string[] args) { 
   char[21] greeting1 = "Всем привет"; 
   writefln("%s", greeting1); 

   char[] greeting2 = "Доброе утро".dup; 
   writefln("%s", greeting2); 
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

Всем привет
Доброе утро

Тип string

Строки string встроены в язык D. Эти строки совместимы с массивом символов, показанным выше. В следующем примере показано простое объявление строки.

string greeting1 = "Hello all";

Насколько мне известно, это практически то же, что и массивы, только неизменяемые. Тип string является псевдонимом для выражения
immutable char[]
– прим. пер.

Пример

import std.stdio;

void main(string[] args) { 
   string greeting1 = "Всем привет"; 
   writefln("%s", greeting1);  
   
   char[] greeting2 = "Доброе утро".dup; 
   writefln("%s", greeting2);  
   
   string greeting3 = greeting1; 
   writefln("%s", greeting3); 
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

Всем привет
Доброе утро
Всем привет

Соединение строк (конкатенация)

Для соединения строк в языке D используется символ тильды (~).

Пример

import std.stdio;

void main(string[] args) { 
   string greeting1 = "Доброе"; 
   char[] greeting2 = "утро".dup; 
   
   char[] greeting3 = greeting1~" "~greeting2; 
   writefln("%s", greeting3); 
   
   string greeting4 = "утро"; 
   string greeting5 = greeting1~" "~greeting4; 
   writefln("%s", greeting5); 
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

Доброе утро
Доброе утро

Длина строки

Длину строки в байтах можно получить с помощью функции length.

Пример

import std.stdio;  

void main(string[] args) { 
   string greeting1 = "Доброе"; 
   writefln("Длина строки greeting1 равна %d", greeting1.length); 
   
   char[] greeting2 = "утро".dup;        
   writefln("Длина строки greeting2 равна %d", greeting2.length); 
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

Длина строки greeting1 равна 12
Длина строки greeting2 равна 8

Цифры или буквы латинского алфавита обычно занимают по одному байту. Буквы кириллицы в кодировке UTF-8 занимают по 2 байта. Существуют алфавиты, символы которых могут занимать ещё больше байт, например иероглифы некоторых китайских диалектов. – прим. пер.

Сравнение строк

В языке D сравнивать строки довольно просто. Для сравнения строк вы можете использовать операторы ==, <, и >.

Example

import std.stdio; 
 
void main() { 
   string s1 = "Привет"; 
   string s2 = "Мир";
   string s3 = "Мир";
   
   if (s2 == s3) { 
      writeln("s2: ",s2," и s3: ",s3, "  – это одно и тоже!"); 
   }
   
   if (s1 < s2) { 
      writeln("'", s1, "' предшествует '", s2, "'."); 
   } else { 
      writeln("'", s2, "' предшествует '", s1, "'."); 
   }
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

s2: Мир и s3: Мир  – это одно и тоже!
'Мир' предшествует 'Привет'.

Замещение строк

Мы можем заменить часть строки, используя операцию среза string[].

Example

import std.stdio; 
import std.string; 
 
void main() {
   char[] s1 = "привет, Земля  ".dup; 
   char[] s2 = "космос".dup;
   
   s1[14..26] = s2[0..12]; 
   writeln(s1);
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

привет, космос

Индексные методы

Индексные методы для нахождения подстроки в строке, включают indexOf (поиск первого вхождения) и lastIndexOf (поиск последнего вхождения), и объясняются на следующем примере.

Пример

import std.stdio;
import std.string;

void main() { 
   char[] s1 = "привет, Мир ".dup; 
    
   writeln("indexOf подстроки вет внутри привет, Мир равен ", std.string.indexOf(s1, "вет")); 
   writeln(s1); 
   writeln("lastIndexOf подстроки И внутри привет, Мир равен " , std.string.lastIndexOf(s1, "И", CaseSensitive.no));
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

indexOf подстроки вет внутри привет, Мир равен 6
привет, Мир 
lastIndexOf подстроки И внутри привет, Мир равен 16

Управление регистрами

Методы, используемые для изменения регистров, показаны в следующем примере.

Пример

import std.stdio;
import std.string;

void main() { 
   char[] s1 = "привет, Мир ".dup; 
   writeln("Строка s1 с заглавной буквы равна ", capitalize(s1)); 
    
   writeln("Строка s1 в верхнем регистре равна ", toUpper(s1)); 
    
   writeln("Строка s1 в нижнем регистре равна ", toLower(s1));   
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

Строка s1 с заглавной буквы равна Привет, мир 
Строка s1 в верхнем регистре равна ПРИВЕТ, МИР 
Строка s1 в нижнем регистре равна привет, мир 

Ограничение по символам

Ограничение по символам в строках показано в следующем примере.

Пример

import std.stdio;
import std.string;

void main() { 
   string s = "П123Привет1";  
   
   string result = munch(s, "0123456789П"); 
   writeln("Оставить только начальные символы: ", result);  
   
   result = squeeze(s, "0123456789П"); 
   writeln("Отсечь начальные символы: ", result); 
   
   s = "  Привет, Мир  "; 
   writeln("Избавиться от начальных и конечных пробелов: ", strip(s)); 
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

Оставить только начальные символы: П123П
Отсечь начальные символы: ривет1
Избавиться от начальных и конечных пробелов: Привет, Мир

К сожалению, munch, squeeze и ещё несколько не показанных здесь функций из модуля std.string в 2017 году объявлены устаревшими, и в 2018 будут удалены из стандартной библиотеки. Вместо них предлагается использовать регулярные выражения. – прим. пер.


Предыдущая страница
Следующая страница