Axiom Справочник языка

Глава 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
0

LEFT

Функция 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) + "]"

Программа выводит:

рим
😀
[]

См. также