Глава 8
Строки и символы
Текст в Axiom хранится в значениях типа STRING, а вся работа с ним идёт через встроенные функции: одна измеряет длину, другие выделяют фрагмент, ищут и заменяют совпадения, меняют регистр, собирают и разбирают списки. Глава объясняет, как устроено строковое значение, в каких единицах измеряется текст и как выбрать функцию под задачу.
Представление текста
Тип STRING и строки фиксированной длины STRING*N описаны на странице строковых типов, а запись литералов, кавычки и интерполяция — в строковых литералах. Эти правила отвечают за то, как текст попадает в программу; функции ниже определяют, что с ним можно сделать дальше.
Единица хранения не совпадает с видимым символом. Эмодзи занимает суррогатную пару из двух кодовых единиц UTF-16, а буква со знаком ударения — несколько кодов. В LEN, LEFT, RIGHT и MID поэтому можно выбрать UTF16, CODEPOINT или GRAPHEME, тогда как позиции INSTR и других обычных позиционных функций всегда остаются позициями UTF-16.
Отдельный случай — числовой код символа. CHR и ASC связывают младшие коды с таблицей CP866, а CHRW и ASCW работают непосредственно с Unicode. Код символа, длина строки и ширина нарисованного текста — три разные величины, и путать их не следует.
Выбор функции по задаче
Функцию удобно выбирать по тому, что нужно получить на выходе. LEN даёт длину текста; LEFT, RIGHT и MID — фрагмент; INSTR — позицию найденного фрагмента, а CONTAINS отвечает только на вопрос, есть ли он в строке. Замена, обрезка и дополнение возвращают новую строку, поэтому результат нужно присвоить переменной или передать дальше: исходное значение вызова не меняют.
Темы главы
Группы строковых функций
Функции главы собраны в пять групп по назначению:
- LEN, LEFT, RIGHT и MID измеряют текст и выделяют его части; для них можно выбрать кодовые единицы UTF-16, коды Unicode или графемы.
- TRIM, LTRIM и RTRIM убирают заполнение у краёв строки, LCASE и UCASE меняют регистр, REVERSE разворачивает порядок кодов Unicode.
- Функции поиска проверяют наличие фрагмента, находят его позицию или считают вхождения; REPLACE и REPLACEMANY заменяют точные фрагменты.
- Функции построения повторяют текст, добавляют заполнение, вставляют или удаляют фрагменты; SPLIT разбивает текст на массив строк, а JOIN соединяет элементы массива.
- ASC, ASCW, CHR и CHRW преобразуют символы и числовые коды; их правила описаны в статье «Коды символов».
Поиск по шаблону выполняют регулярные выражения; обычный строковый поиск сравнивает заданный фрагмент буквально.
Позиции, параметры и тип строки
Общие для всей главы соглашения сводятся к трём правилам.
- Начальная позиция строковых операций равна 1; ноль используется как результат отсутствующего совпадения в INSTR и INSTRREV.
- Необязательность параметра определяется формой вызова: TRIM допускает явный набор, SPLIT и JOIN — разделитель, функции дополнения — заполнитель.
- Тип аргумента зависит от его назначения: текст передаётся строкой STRING, позиция или количество — целым числом INTEGER, набор строк — массивом STRING[]. Точный договор каждого аргумента приведён рядом с соответствующей функцией.