Глава 8
Длина строки и фрагменты
Измерить текст и отделить от него часть приходится при разборе записи, проверке ввода и выводе по столбцам. Для этого служат LEN, LEFT, RIGHT и MID: они возвращают новое значение, а исходную строку не меняют. Перед выбором функции важно решить, в каких единицах считать текст, — от этого зависит, где пройдёт граница фрагмента.
Остановка обработки текста
При последовательном обходе текста в формах LEN, LEFT, RIGHT и MID с единицами CODEPOINT или GRAPHEME исполнитель периодически проверяет запрос остановки программы. Остановка завершает запуск как отменённый, а не как перехватываемую ошибку CATCH. Результат отдельного вызова возвращается целиком, частичный фрагмент не возвращается.
Единицы измерения текста
Функции LEN, LEFT, RIGHT и MID имеют отдельные формы с выбором единицы. UTF16 считает кодовые единицы UTF-16; CODEPOINT — коды Unicode, сохраняя корректную суррогатную пару целиком; GRAPHEME — текстовые элементы .NET, например букву вместе с отдельным знаком ударения. Без выбора единицы используется UTF16.
Речь идёт о длине текста, а не о его ширине на экране; строки при этом не нормализуются. Изолированная суррогатная единица сохраняется и занимает одну позицию в режиме CODEPOINT. Позиции INSTR и INSTRREV всегда выражены в UTF-16, поэтому передавать их в MID с другой единицей без пересчёта нельзя.
LEN
Функция LEN измеряет длину строки в выбранных единицах текста. Её применяют, когда длину нужно знать до выделения фрагмента или проверки ввода. Вызов выполняется в выражении и не требует открытия экрана, холста или файла; исходные значения аргументов при этом не изменяются.
Синтаксис
Форма 1:
LEN(<текст>)Форма 2:
LEN(<текст>, <единица измерения>)Аргументы
| Аргумент | Что передать |
|---|---|
<текст> | Передайте исходную строку типа STRING, которую функция должна обработать. |
<единица измерения> | Передайте строку типа STRING: "UTF16", "CODEPOINT" или "GRAPHEME". Регистр букв несущественен, пробелы не удаляются. Без этого аргумента используется UTF16. |
Возвращаемое значение
Функция возвращает целое число типа INTEGER — количество единиц выбранного вида. Для пустой строки результат равен 0.
Правила и пограничные случаи
Без аргумента единицы функция считает кодовые единицы UTF-16: обычная буква занимает одну, а эмодзи вне основной плоскости Unicode — две. Подробное сравнение единиц приведено в начале этой статьи.
Диагностика
Ошибка MB3007 возникает при пустой или неизвестной строке единицы измерения, в том числе если исходный текст пуст.
Пример
PRINT LEN("А😀Б")
PRINT LEN("А😀Б", "CODEPOINT")
PRINT LEN("е́", "GRAPHEME")
PRINT LEN("")Программа выводит:
4
3
1
0LEFT
Функция LEFT возвращает фрагмент заданной длины из начала строки. Так извлекают префикс, например первые три буквы названия. Вызов выполняется в выражении и не требует открытия экрана, холста или файла; исходные значения аргументов при этом не изменяются.
Синтаксис
Форма 1:
LEFT(<текст>, <количество>)Форма 2:
LEFT(<текст>, <количество>, <единица измерения>)Аргументы
| Аргумент | Что передать |
|---|---|
<текст> | Передайте исходную строку типа STRING, которую функция должна обработать. |
<количество> | Передайте целое число типа INTEGER, задающее количество единиц текста. Значение должно быть больше нуля. |
<единица измерения> | Передайте строку типа STRING: "UTF16", "CODEPOINT" или "GRAPHEME". Регистр букв несущественен, пробелы не удаляются. Без этого аргумента используется UTF16. |
Возвращаемое значение
Функция возвращает строку типа STRING с указанным количеством единиц из начала текста.
Правила и пограничные случаи
Если количество больше длины текста, возвращается весь текст. Для пустого текста возвращается пустая строка. В режиме UTF16 граница может разделить суррогатную пару; CODEPOINT и GRAPHEME используют соответствующие границы текста.
Диагностика
Ошибка MB3007 возникает, если количество не больше нуля или указана неизвестная единица измерения.
Пример
PRINT LEFT("Пример", 3)
PRINT LEFT("А😀Б", 2, "CODEPOINT")
PRINT "[" + LEFT("", 1) + "]"Программа выводит:
При
А😀
[]RIGHT
Функция RIGHT возвращает фрагмент заданной длины из конца строки. Так извлекают суффикс, например последние цифры кода. Вызов выполняется в выражении и не требует открытия экрана, холста или файла; исходные значения аргументов при этом не изменяются.
Синтаксис
Форма 1:
RIGHT(<текст>, <количество>)Форма 2:
RIGHT(<текст>, <количество>, <единица измерения>)Аргументы
| Аргумент | Что передать |
|---|---|
<текст> | Передайте исходную строку типа STRING, которую функция должна обработать. |
<количество> | Передайте целое число типа INTEGER, задающее количество единиц текста. Значение должно быть больше нуля. |
<единица измерения> | Передайте строку типа STRING: "UTF16", "CODEPOINT" или "GRAPHEME". Регистр букв несущественен, пробелы не удаляются. Без этого аргумента используется UTF16. |
Возвращаемое значение
Функция возвращает строку типа STRING с указанным количеством единиц из конца текста.
Правила и пограничные случаи
Если количество больше длины текста, возвращается весь текст. Для пустого текста возвращается пустая строка. Единица измерения определяет границы фрагмента так же, как у функции LEFT.
Диагностика
Ошибка MB3007 возникает, если количество не больше нуля или указана неизвестная единица измерения.
Пример
PRINT RIGHT("Пример", 3)
PRINT RIGHT("А😀Б", 2, "CODEPOINT")
PRINT "[" + RIGHT("", 1) + "]"Программа выводит:
мер
😀Б
[]MID
Функция MID возвращает фрагмент строки, начиная с указанной позиции. Она извлекает часть текста из его середины, например число внутри записи. Вызов выполняется в выражении и не требует открытия экрана, холста или файла; исходные значения аргументов при этом не изменяются.
Синтаксис
Форма 1:
MID(<текст>, <начальная позиция>, <количество>)Форма 2:
MID(<текст>, <начальная позиция>, <количество>, <единица измерения>)Аргументы
| Аргумент | Что передать |
|---|---|
<текст> | Передайте исходную строку типа STRING, которую функция должна обработать. |
<начальная позиция> | Передайте целое число типа INTEGER с начальной позицией. Позиции отсчитываются от 1. |
<количество> | Передайте целое число типа INTEGER, задающее количество единиц текста. Значение должно быть больше нуля. |
<единица измерения> | Передайте строку типа STRING: "UTF16", "CODEPOINT" или "GRAPHEME". Регистр букв несущественен, пробелы не удаляются. Без этого аргумента используется UTF16. |
Возвращаемое значение
Функция возвращает строку типа STRING с фрагментом заданной длины, начиная с позиции 1 или более.
Правила и пограничные случаи
Если начальная позиция больше длины строки, результат пуст. Если до конца текста осталось меньше единиц, чем запрошено, возвращается остаток строки. Для пустого текста результат пуст. Аргумент количества обязателен; формы MID только с текстом и началом в Axiom нет.
Диагностика
Ошибка MB3007 возникает, если начало меньше 1, количество не больше нуля или строка единицы измерения неизвестна.
Пример
PRINT MID("Пример", 2, 3)
PRINT MID("А😀Б", 2, 1, "CODEPOINT")
PRINT "[" + MID("abc", 9, 1) + "]"Программа выводит:
рим
😀
[]