4.3 Создание строк

Следующие функции создают строки: либо с нуля, либо путём объединения строк, либо путём их разбиения. (О функциях, которые создают строки на основе изменённого содержимого других строк, таких как string-replace и replace-regexp-in-string, см. Поиск и замена.)

Функция: make-string count character &optional multibyte

Эта функция возвращает строку, состоящую из count повторений character. Если count отрицателен, возникает ошибка.

(make-string 5 ?x)
     ⇒ "xxxxx"
(make-string 0 ?x)
     ⇒ ""

Обычно, если character является ASCII-символом, результат является однобайтовой строкой. Но если необязательный аргумент multibyte не равен nil, функция создаст многобайтовую строку. Это полезно, если позже вам понадобится объединить результат с не-ASCII-строками или заменить некоторые его символы на не-ASCII-символы.

Другие функции для сравнения с этой: make-vector (см. Векторы) и make-list (см. Построение ячеек cons и списков).

Функция: string &rest characters

Возвращает строку, содержащую символы characters.

(string ?a ?b ?c)
     ⇒ "abc"
Функция: substring string &optional start end

Эта функция возвращает новую строку, состоящую из тех символов string, которые находятся в диапазоне от (включая) символа с индексом start до (не включая) символа с индексом end. Первый символ имеет индекс ноль. С одним аргументом эта функция просто копирует string.

(substring "abcdefg" 0 3)
     ⇒ "abc"

В приведённом выше примере индекс для ‘a’ равен 0, индекс для ‘b’ равен 1, а индекс для ‘c’ равен 2. Индекс 3 — который является четвёртым символом в строке — отмечает позицию символа, до которой копируется подстрока. Таким образом, из строки "abcdefg" копируется ‘abc’.

Отрицательное число отсчитывает с конца строки, так что −1 обозначает индекс последнего символа строки. Например:

(substring "abcdefg" -3 -1)
     ⇒ "ef"

В этом примере индекс для ‘e’ равен −3, индекс для ‘f’ равен −2, а индекс для ‘g’ равен −1. Поэтому ‘e’ и ‘f’ включаются, а ‘g’ исключается.

Когда для end используется nil, это означает длину строки. Таким образом,

(substring "abcdefg" -3 nil)
     ⇒ "efg"

Опускание аргумента end эквивалентно указанию nil. Отсюда следует, что (substring string 0) возвращает копию всей string.

(substring "abcdefg" 0)
     ⇒ "abcdefg"

Но для этой цели мы рекомендуем copy-sequence (см. Последовательности).

Если копируемые из string символы имеют текстовые свойства, свойства также копируются в новую строку. См. Текстовые свойства.

substring также принимает вектор в качестве первого аргумента. Например:

(substring [a b (c) "d"] 1 3)
     ⇒ [b (c)]

Ошибка wrong-type-argument возникает, если start не является целым числом или если end не является ни целым числом, ни nil. Ошибка args-out-of-range возникает, если start указывает на символ, следующий за end, или если любое из целых чисел выходит за допустимый диапазон для string.

Сравните эту функцию с buffer-substring (см. Изучение содержимого буфера), которая возвращает строку, содержащую часть текста в текущем буфере. Начало строки имеет индекс 0, но начало буфера имеет индекс 1.

Функция: substring-no-properties string &optional start end

Работает как substring, но отбрасывает все текстовые свойства из результата. Кроме того, start может быть опущен или равен nil, что эквивалентно 0. Таким образом, (substring-no-properties string) возвращает копию string с удалёнными всеми текстовыми свойствами.

Функция: concat &rest sequences

Эта функция возвращает строку, состоящую из символов аргументов, переданных ей (вместе с их текстовыми свойствами, если таковые имеются). Аргументами могут быть строки, списки чисел или векторы чисел; сами они не изменяются. Если concat не получает аргументов, она возвращает пустую строку.

(concat "abc" "-def")
     ⇒ "abc-def"
(concat "abc" (list 120 121) [122])
     ⇒ "abcxyz"
;; nil — это пустая последовательность.
(concat "abc" nil "-def")
     ⇒ "abc-def"
(concat "The " "quick brown " "fox.")
     ⇒ "The quick brown fox."
(concat)
     ⇒ ""

Эта функция не всегда выделяет новую строку. Вызывающим сторонам не рекомендуется полагаться на то, что результат будет новой строкой или что он будет eq существующей строке.

В частности, изменение возвращаемого значения может непреднамеренно изменить другую строку, изменить константную строку в программе или даже вызвать ошибку. Чтобы получить строку, которую можно безопасно изменять, используйте copy-sequence для результата.

Информацию о других функциях конкатенации см. в описании mapconcat в Функции отображения, vconcat в Функции для векторов и append в Построение ячеек cons и списков. О конкатенации отдельных аргументов командной строки в строку для использования в качестве команды оболочки см. combine-and-quote-strings.

Функция: split-string string &optional separators omit-nulls trim

Эта функция разбивает string на подстроки на основе регулярного выражения separators (см. Регулярные выражения). Каждое совпадение для separators определяет точку разбиения; подстроки между точками разбиения объединяются в список, который возвращается.

Если separators равен nil (или опущен), по умолчанию используется значение split-string-default-separators, и функция ведёт себя так, как если бы omit-nulls был равен t.

Если omit-nulls равен nil (или опущен), результат содержит пустые строки всякий раз, когда есть два последовательных совпадения для separators, или совпадение примыкает к началу или концу string. Если omit-nulls равен t, эти пустые строки исключаются из результата.

Если необязательный аргумент trim не равен nil, он должен быть регулярным выражением для обрезания текста в начале и конце каждой подстроки. Если обрезание делает подстроку пустой, она считается пустой строкой.

Если вам нужно разбить строку на список отдельных аргументов командной строки, подходящих для call-process или start-process, см. split-string-and-unquote.

Примеры:

(split-string "  two words ")
     ⇒ ("two" "words")

Результатом не является ("" "two" "words" ""), что редко было бы полезно. Если вам нужен такой результат, используйте явное значение для separators:

(split-string "  two words "
              split-string-default-separators)
     ⇒ ("" "two" "words" "")
(split-string "Soup is good food" "o")
     ⇒ ("S" "up is g" "" "d f" "" "d")
(split-string "Soup is good food" "o" t)
     ⇒ ("S" "up is g" "d f" "d")
(split-string "Soup is good food" "o+")
     ⇒ ("S" "up is g" "d f" "d")

Пустые совпадения учитываются, за исключением того, что split-string не будет искать финальное пустое совпадение, если она уже достигла конца строки с помощью непустого совпадения или если string пуста:

(split-string "aooob" "o*")
     ⇒ ("" "a" "" "b" "")
(split-string "ooaboo" "o*")
     ⇒ ("" "" "a" "b" "")
(split-string "" "")
     ⇒ ("")

Однако когда separators может совпадать с пустой строкой, omit-nulls обычно равен t, поэтому тонкости в трёх предыдущих примерах редко актуальны:

(split-string "Soup is good food" "o*" t)
     ⇒ ("S" "u" "p" " " "i" "s" " " "g" "d" " " "f" "d")
(split-string "Nice doggy!" "" t)
     ⇒ ("N" "i" "c" "e" " " "d" "o" "g" "g" "y" "!")
(split-string "" "" t)
     ⇒ nil

Несколько странное, но предсказуемое поведение может возникать для некоторых “нежадных” значений separators, которые могут предпочитать пустые совпадения непустым. Опять же, такие значения редко встречаются на практике:

(split-string "ooo" "o*" t)
     ⇒ nil
(split-string "ooo" "\\|o+" t)
     ⇒ ("o" "o" "o")
Переменная: split-string-default-separators

Значение по умолчанию для separators в split-string. Обычно равно "[ \f\t\n\r\v]+".

Функция: string-clean-whitespace string

Очищает пробелы в string, сворачивая последовательности пробелов в один пробел, а также удаляя все пробелы в начале и в конце string.

Функция: string-trim-left string &optional regexp

Удаляет начальный текст, совпадающий с regexp, из string. regexp по умолчанию равен ‘[ \t\n\r]+’.

Функция: string-trim-right string &optional regexp

Удаляет конечный текст, совпадающий с regexp, из string. regexp по умолчанию равен ‘[ \t\n\r]+’.

Функция: string-trim string &optional trim-left trim-right

Удаляет начальный текст, совпадающий с trim-left, и конечный текст, совпадающий с trim-right, из string. Оба регулярных выражения по умолчанию равны ‘[ \t\n\r]+’.

Функция: string-fill string width

Пытается перенести string по словам так, чтобы она отображалась строками не шире width. Заполнение выполняется только по границам пробелов. Если есть отдельные слова, длина которых превышает width, они не укорачиваются, и поэтому в таком случае string может отображаться строками шире width.

Функция: string-limit string length &optional end coding-system

Если string короче length символов, возвращается string как есть. В противном случае возвращается подстрока string, состоящая из первых length символов. Если задан необязательный параметр end, вместо этого возвращается строка из последних length символов.

Если coding-system не равен nil, string будет закодирована перед ограничением, и результатом будет однобайтовая строка, которая короче length байт. Если string содержит символы, которые кодируются в несколько байтов (например, при использовании utf-8), результирующая однобайтовая строка никогда не обрезается в середине представления символа.

Эта функция измеряет длину строки в символах или байтах и поэтому в целом не подходит, если вам нужно укорачивать строки для целей отображения; используйте вместо этого truncate-string-to-width, window-text-pixel-size или string-glyph-split (см. Размер отображаемого текста).

Функция: string-lines string &optional omit-nulls keep-newlines

Разбивает string на список строк по границам перевода строки. Если необязательный аргумент omit-nulls не равен nil, удаляет пустые строки из результатов. Если необязательный аргумент keep-newlines не равен nil, не удаляет конечные переводы строк из результирующих строк.

Функция: string-pad string length &optional padding start

Дополняет string до заданной length, используя padding в качестве дополняющего символа. padding по умолчанию равен пробелу. Если string длиннее length, дополнение не выполняется. Если start равен nil или опущен, дополнение добавляется к символам string, а если он не равен nil, дополнение добавляется перед символами string.

Функция: string-chop-newline string

Удаляет конечный перевод строки, если он есть, из string.