Spec-Zone.ru › Elixir 1.10

Строка

Строки в Elixir представляют собой двоичные данные, закодированные в UTF-8.

Строки в Elixir — это последовательность символов Юникода, обычно записываемые в двойных кавычках, например, "hello" и "héllò".

В случае, если строка должна содержать двойную кавычку, двойные кавычки необходимо экранировать обратной косой чертой, например: "this is a string with \"double quotes\"".

Вы можете конкатенировать две строки с помощью оператора <>/2:

iex> "hello" <> " " <> "world"
"hello world"

Интерполяция

Строки в Elixir также поддерживают интерполяцию. Это позволяет вам разместить некоторое значение посередине строки, используя синтаксис #{}:

iex> name = "joe"
iex> "hello #{name}"
"hello joe"

Любое выражение Elixir допустимо внутри интерполяции. Если задана строка, строка интерполируется как есть. Если задано любое другое значение, Elixir попытается преобразовать его в строку, используя протокол String.Chars. Это позволяет, например, выводить целое число из интерполяции:

iex> "2 + 2 = #{2 + 2}"
"2 + 2 = 4"

В случае, если значение, которое вы хотите интерполировать, не может быть преобразовано в строку, потому что у него нет текстового представления, будет поднято исключение протокола.

Экранирование символов

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

  • \a - Звуковой сигнал
  • \b - Возврат на один символ назад
  • \t - Горизонтальная табуляция
  • \n - Перевод строки
  • \v - Вертикальная табуляция
  • \f - Форматирование страницы
  • \r - Возврат каретки
  • \e - Экранирование
  • \# - Возвращает символ #, пропуская интерполяцию
  • \xNN - Байта, представленный шестнадцатеричным значением NN
  • \uNNNN - Код Юникода, представленный NNNN

Обратите внимание, что в Elixir строках обычно не рекомендуется использовать \xNN, так как введение недопустимой последовательности байтов сделает строку недействительной. Если вам нужно ввести символ по его шестнадцатеричному представлению, лучше работать с кодами Юникода, например, \uNNNN. На самом деле, понимание кодов Юникода может быть очень важным при выполнении низкоуровневых манипуляций со строками, поэтому давайте подробнее рассмотрим их далее.

Кодовые точки и кластеры графем

Функции в этом модуле работают в соответствии со Стандартом Юникода, версия 12.1.0.

В соответствии со стандартом, кодовая точка — это единственный символ Юникода, который может быть представлен одним или несколькими байтами.

Например, хотя кодовая точка "é" представляет собой один символ, её внутреннее представление использует два байта:

iex> String.length("é")
1
iex> byte_size("é")
2

Кроме того, этот модуль также представляет понятие кластера графем (далее упоминается как графемы). Графемы могут состоять из нескольких кодовых точек, которые могут восприниматься читателями как один символ. Например, "é" может быть представлено либо как одна кодовая точка "е с острым ударением", либо как буква "e", за которой следует "диакритический знак острого ударения" (две кодовые точки):

iex> string = "\u0065\u0301"
iex> byte_size(string)
3
iex> String.length(string)
1
iex> String.codepoints(string)
["e", "́"]
iex> String.graphemes(string)
["é"]

Хотя пример выше состоит из двух символов, он воспринимается пользователями как один.

Графемы также могут быть двумя символами, интерпретируемыми как один в некоторых языках. Например, некоторые языки могут рассматривать "ch" как один символ. Однако, поскольку эта информация зависит от локали, она не учитывается в этом модуле.

В целом, функции в этом модуле полагаются на Стандарт Юникода, но не содержат никакого поведения, специфичного для локали. Более подробную информацию о графемах можно найти в Приложении к стандарту Юникода № 29.

Для преобразования двоичных данных в другое кодирование и для механизмов нормализации Юникода см. модуль Erlang's :unicode.

Операции со строками и двоичными данными

Для соответствия Стандарту Юникода многие функции в этом модуле работают за линейное время, так как им нужно пройти по всей строке, учитывая правильные кодовые точки Юникода.

Например, String.length/1 будет занимать больше времени по мере увеличения входных данных. С другой стороны, Kernel.byte_size/1 всегда работает за постоянное время (то есть независимо от размера входных данных).

Это означает, что часто при использовании функций в этом модуле возникают затраты на производительность по сравнению с более низкоуровневыми операциями, которые работают непосредственно с двоичными данными:

  • Kernel.binary_part/3 - извлекает часть двоичных данных
  • Kernel.bit_size/1 и Kernel.byte_size/1 - функции, связанные с размером
  • Kernel.is_bitstring/1 и Kernel.is_binary/1 - функции проверки типа
  • Плюс ряд функций для работы с двоичными данными (байтами) в модуле :binary

Существует много ситуаций, когда использование модуля String можно избежать в пользу двоичных функций или сопоставления с образцом. Например, предположим, у вас есть строка prefix и вы хотите удалить этот префикс из другой строки с именем full.

Можно было бы написать:

iex> take_prefix = fn full, prefix ->
...>   base = String.length(prefix)
...>   String.slice(full, base, String.length(full) - base)
...> end
iex> take_prefix.("Mr. John", "Mr. ")
"John"

Хотя приведенная выше функция работает, она работает медленно. Чтобы вычислить длину строки, нам нужно полностью её пройти, поэтому мы проходим по строкам prefix и full, а затем вырезаем строку full, пройдясь по ней ещё раз.

Первая попытка улучшить это — использование диапазонов:

iex> take_prefix = fn full, prefix ->
...>   base = String.length(prefix)
...>   String.slice(full, base..-1)
...> end
iex> take_prefix.("Mr. John", "Mr. ")
"John"

Хотя это намного лучше (мы не проходим по full дважды), его можно улучшить. В данном случае, так как мы хотим извлечь подстроку из строки, мы можем использовать Kernel.byte_size/1 и Kernel.binary_part/3, так как нет вероятности, что мы будем вырезать в середине кодовой точки, состоящей из более одного байта:

iex> take_prefix = fn full, prefix ->
...>   base = byte_size(prefix)
...>   binary_part(full, base, byte_size(full) - base)
...> end
iex> take_prefix.("Mr. John", "Mr. ")
"John"

Или просто использовать сопоставление с образцом:

iex> take_prefix = fn full, prefix ->
...>   base = byte_size(prefix)
...>   <<_::binary-size(base), rest::binary>> = full
...>   rest
...> end
iex> take_prefix.("Mr. John", "Mr. ")
"John"

С другой стороны, если вы хотите динамически вырезать строку на основе целого значения, то использование String.slice/3 — лучший вариант, так как гарантируется, что мы не разделим кодовую точку на несколько байтов неправильно.

Целые кодовые точки

Хотя кодовые точки можно представлять как целые числа, этот модуль представляет все кодовые точки в виде строк. Например:

iex> String.codepoints("olá")
["o", "l", "á"]

Есть несколько способов получить целое число кодовой точки символа. Можно использовать конструкцию ?:

iex> ?o
111

iex> ?á
225

Или также через сопоставление с образцом:

iex> <<aacute::utf8>> = "á"
iex> aacute
225

Как мы видели выше, кодовые точки можно вставлять в строку по их шестнадцатеричному коду:

iex> "ol\u00E1"
"olá"

Наконец, чтобы преобразовать строку в список целых кодовых точек, обычно называемых «списками символов», вы можете вызвать Strig.to_charlist:

iex> String.to_charlist("olá")
[111, 108, 225]

Самосинхронизация

Кодирование UTF-8 является самосинхронизирующимся. Это означает, что если обнаружатся некорректные данные (т.е. данные, которые невозможны в соответствии с определением кодирования), необходимо отклонить только одну кодовую точку.

Этот модуль использует это свойство, чтобы игнорировать такие недопустимые символы. Например, length/1 вернёт правильный результат, даже если в него введена недопустимая кодовая точка.

Другими словами, этот модуль ожидает, что некорректные данные будут обнаружены в другом месте, обычно при получении данных из внешнего источника. Например, драйвер, который считывает строки из базы данных, будет отвечать за проверку правильности кодирования. String.chunk/2 можно использовать для разделения строки на правильные и неправильные части.

Компиляция двоичных шаблонов

Многие функции в этом модуле работают с шаблонами. Например, String.split/2 может разбить строку на несколько строк, задав шаблон. Этот шаблон может быть строкой, списком строк или скомпилированным шаблоном:

iex> String.split("foo bar", " ")
["foo", "bar"]

iex> String.split("foo bar!", [" ", "!"])
["foo", "bar", ""]

iex> pattern = :binary.compile_pattern([" ", "!"])
iex> String.split("foo bar!", pattern)
["foo", "bar", ""]

Скомпилированный шаблон полезен, когда то же самое соответствие будет выполнено многократно. Обратите внимание, что скомпилированный шаблон не может быть сохранен в атрибуте модуля, так как шаблон генерируется во время выполнения и не сохраняется на этапе компиляции.

Сводка

Типы

codepoint()

Единая кодовая точка Юникода, закодированная в UTF-8. Она может занимать один или несколько байтов.

grapheme()

Несколько кодовых точек, которые могут восприниматься читателями как один символ

pattern()

Шаблон, используемый в функциях, таких как replace/3 и split/2

t()

Двоичные данные, закодированные в UTF-8.

Функции

at(string, position)

Возвращает графем в position заданной UTF-8 string. Если position больше, чем длина string, то возвращает nil.

bag_distance(string1, string2)

Вычисляет расстояние Бэга между двумя строками.

capitalize(string, mode \\ :default)

Преобразует первый символ в заданной строке в верхний регистр, а остальные — в нижний регистр в соответствии с mode.

chunk(string, trait)

Разбивает строку на куски символов, которые обладают общим свойством.

codepoints(string)

Возвращает все кодовые точки в строке.

contains?(string, contents)

Проверяет, содержит ли string какие-либо из заданных contents.

downcase(string, mode \\ :default)

Преобразует все символы в заданной строке в нижний регистр в соответствии с mode.

duplicate(subject, n)

Возвращает строку subject, продублированную n раз.

ends_with?(string, suffix)

Возвращает true если string заканчивается любым из заданных суффиксов.

equivalent?(string1, string2)

Возвращает true если string1 канонически эквивалентна 'string2'.

first(string)

Возвращает первый графем из UTF-8 строки, nil если строка пустая.

graphemes(string)

Возвращает графемы Юникода в строке в соответствии с алгоритмом расширенного графема.

jaro_distance(string1, string2)

Вычисляет расстояние Яро (подобие) между двумя строками.

last(string)

Возвращает последний графем из UTF-8 строки, nil если строка пустая.

length(string)

Возвращает количество графем Юникода в строке UTF-8.

match?(string, regex)

Проверяет, соответствует ли string заданному регулярному выражению.

myers_difference(string1, string2)

Возвращает список ключевых слов, представляющий скрипт редактирования.

next_codepoint(string)

Возвращает следующую кодовую точку в строке.

next_grapheme(binary)

Возвращает следующую графем в строке.

next_grapheme_size(string)

Возвращает размер следующей графеми.

normalize(string, form)

Преобразует все символы в string в форму уникодовой нормализации, определенную form.

pad_leading(string, count, padding \\ [" "])

Возвращает новую строку, дополненную начальным заполнителем, который состоит из элементов из padding.

pad_trailing(string, count, padding \\ [" "])

Возвращает новую строку, дополненную конечным заполнителем, который состоит из элементов из padding.

printable?(string, character_limit \\ :infinity)

Проверяет, содержит ли строка только печатные символы до character_limit.

replace(subject, pattern, replacement, options \\ [])

Возвращает новую строку, полученную заменой вхождений pattern в subject на replacement.

replace_leading(string, match, replacement)

Заменяет все вхождения match в начале строки на replacement из match в string.

replace_prefix(string, match, replacement)

Заменяет префикс в string на replacement если он соответствует match.

replace_suffix(string, match, replacement)

Заменяет суффикс в string на replacement если он соответствует match.

replace_trailing(string, match, replacement)

Заменяет все вхождения match в конце строки на replacement в string.

reverse(string)

Инвертирует графемы в заданной строке.

slice(string, range)

Возвращает подстроку от смещения, задаваемого началом диапазона, до смещения, задаваемого концом диапазона.

slice(string, start, len)

Возвращает подстроку, начинающуюся со смещения start, и длиной len.

split(binary)

Делит строку на подстроки на каждом вхождении Unicode пробела, игнорируя начальные и конечные пробелы. Группы пробелов обрабатываются как единственное вхождение. Разбиение не происходит на неразрывном пробеле.

split(string, pattern, options \\ [])

Делит строку на части на основе шаблона.

split_at(string, position)

Разделяет строку на две части по указанному смещению. При отрицательном смещении местоположение рассчитывается с конца строки.

splitter(string, pattern, options \\ [])

Возвращает перечислимый объект, который разбивает строку по требованию.

starts_with?(string, prefix)

Возвращает true если string начинается с любого из заданных префиксов.

to_atom(string)

Преобразует строку в атом.

to_charlist(string)

Преобразует строку в список символов.

to_existing_atom(string)

Преобразует строку в существующий атом.

to_float(string)

Возвращает число с плавающей точкой, текстовое представление которого string.

to_integer(string)

Возвращает целое число, текстовое представление которого string.

to_integer(string, base)

Возвращает целое число, текстовое представление которого string в системе счисления base.

trim(string)

Возвращает строку, из которой удалены все начальные и конечные Unicode пробелы.

trim(string, to_trim)

Возвращает строку, из которой удалены все начальные и конечные to_trim символы.

trim_leading(string)

Возвращает строку, из которой удалены все начальные Unicode пробелы.

trim_leading(string, to_trim)

Возвращает строку, из которой удалены все ведущие символы to_trim.

trim_trailing(string)

Возвращает строку, из которой удалены все заключительные пробелы Unicode.

trim_trailing(string, to_trim)

Возвращает строку, из которой удалены все заключительные символы to_trim.

upcase(string, mode \\ :default)

Преобразует все символы в заданной строке в верхний регистр в соответствии с mode.

valid?(string)

Проверяет, содержит ли string только допустимые символы.

Типы

codepoint()

Спецификации

codepoint() :: t()

Одиночный Unicode-код точки, закодированный в UTF-8. Может занимать один или несколько байтов.

grapheme()

Спецификации

grapheme() :: t()

Несколько кодовых точек, которые могут восприниматься читателями как один символ.

pattern()

Спецификации

pattern() :: t() | [t()] | :binary.cp()

Шаблон, используемый в функциях, таких как replace/3 и split/2

t()

Спецификации

t() :: binary()

Бинарный файл, закодированный в UTF-8.

Типы String.t() и binary() эквивалентны для инструментов анализа. Хотя для тех, кто читает документацию, String.t() подразумевает, что это бинарный файл, закодированный в UTF-8.

Функции

at(строка, позиция)

Характеристики

at(t(), integer()) :: grapheme() | nil

Возвращает графем в position заданной UTF-8 string. Если position больше, чем длина string, то возвращает nil.

Примеры

iex> String.at("elixir", 0)
"e"

iex> String.at("elixir", 1)
"l"

iex> String.at("elixir", 10)
nil

iex> String.at("elixir", -1)
"r"

iex> String.at("elixir", -10)
nil

bag_distance(строка1, строка2)

Характеристики

bag_distance(t(), t()) :: float()

Вычисляет расстояние между двумя строками.

Возвращает значение с плавающей запятой между 0 и 1, представляющее расстояние между string1 и string2.

Расстояние предназначено для эффективного приближения расстояния между двумя строками для быстрого исключения строк, которые сильно различаются.

Алгоритм описан в статье «Сопоставление строк с помощью метрических деревьев с использованием приближенного расстояния» авторов Иларии Бартолини, Паоло Чиаччи и Марко Пателла.

Примеры

iex> String.bag_distance("abc", "")
0.0
iex> String.bag_distance("abcd", "a")
0.25
iex> String.bag_distance("abcd", "ab")
0.5
iex> String.bag_distance("abcd", "abc")
0.75
iex> String.bag_distance("abcd", "abcd")
1.0

capitalize(строка, режим \\ :default)

Характеристики

capitalize(t(), :default | :ascii | :greek) :: t()

Преобразует первый символ в заданной строке в верхний регистр, а оставшиеся символы — в нижний регистр в соответствии с mode.

mode может быть :default, :ascii или :greek. Режим :default учитывает все неявные преобразования, описанные в стандарте Unicode. Режим :ascii переводит только буквы от A до Z в нижний регистр. Режим :greek включает контекстно-зависимые отображения, встречающиеся в греческом языке.

Примеры

iex> String.capitalize("abcd")
"Abcd"

iex> String.capitalize("fin")
"Fin"

iex> String.capitalize("olá")
"Olá"

chunk(строка, признак)

Характеристики

chunk(t(), :valid | :printable) :: [t()]

Разбивает строку на части символов, имеющих общий признак.

Признак может быть одним из двух вариантов:

  • :valid - строка разбивается на части корректных и некорректных последовательностей символов

  • :printable - строка разбивается на части печатаемых и непечатаемых последовательностей символов

Возвращает список двоичных данных, каждый из которых содержит только один тип символов.

Если заданная строка пуста, возвращается пустой список.

Примеры

iex> String.chunk(<<?a, ?b, ?c, 0>>, :valid)
["abc\0"]

iex> String.chunk(<<?a, ?b, ?c, 0, 0xFFFF::utf16>>, :valid)
["abc\0", <<0xFFFF::utf16>>]

iex> String.chunk(<<?a, ?b, ?c, 0, 0x0FFFF::utf8>>, :printable)
["abc", <<0, 0x0FFFF::utf8>>]

codepoints(строка)

Характеристики

codepoints(t()) :: [codepoint()]

Возвращает все кодовые точки в строке.

Для получения подробной информации о кодовых точках и графемах обратитесь к документации модуля String.

Примеры

iex> String.codepoints("olá")
["o", "l", "á"]

iex> String.codepoints("оптими зации")
["о", "п", "т", "и", "м", "и", " ", "з", "а", "ц", "и", "и"]

iex> String.codepoints("ἅἪῼ")
["ἅ", "Ἢ", "ῼ"]

iex> String.codepoints("é")
["é"]

iex> String.codepoints("é")
["e", "́"]

contains?(строка, содержимое)

Характеристики

contains?(t(), pattern()) :: boolean()

Проверяет, содержит ли string какие-либо из заданных contents.

contents может быть строкой, списком строк или скомпилированным шаблоном.

Примеры

iex> String.contains?("elixir of life", "of")
true
iex> String.contains?("elixir of life", ["life", "death"])
true
iex> String.contains?("elixir of life", ["death", "mercury"])
false

Аргумент также может быть скомпилированным шаблоном:

iex> pattern = :binary.compile_pattern(["life", "death"])
iex> String.contains?("elixir of life", pattern)
true

Пустая строка всегда будет соответствовать:

iex> String.contains?("elixir of life", "")
true
iex> String.contains?("elixir of life", ["", "other"])
true

Обратите внимание, что эта функция может соответствовать внутри или через границы графема. Например, рассмотрите графем «é», который состоит из символов «e» и острого ударения. Следующее возвращает true:

iex> String.contains?(String.normalize("é", :nfd), "e")
true

Однако, если «é» представлен одним символом «e с острым» ударением, то он вернёт false:

iex> String.contains?(String.normalize("é", :nfc), "e")
false

downcase(строка, режим \\ :default)

Характеристики

downcase(t(), :default | :ascii | :greek) :: t()

Преобразует все символы в заданной строке в нижний регистр в соответствии с mode.

mode может быть :default, :ascii или :greek. Режим :default учитывает все неявные преобразования, описанные в стандарте Unicode. Режим :ascii переводит только буквы от A до Z в нижний регистр. Режим :greek включает контекстно-зависимые отображения, встречающиеся в греческом языке.

Примеры

iex> String.downcase("ABCD")
"abcd"

iex> String.downcase("AB 123 XPTO")
"ab 123 xpto"

iex> String.downcase("OLÁ")
"olá"

Режим :ascii игнорирует символы Unicode и обеспечивает более производительную реализацию, когда известно, что строка содержит только символы ASCII:

iex> String.downcase("OLÁ", :ascii)
"olÁ"

И :greek правильно обрабатывает контекстно-зависимую сигму в греческом языке:

iex> String.downcase("ΣΣ")
"σσ"

iex> String.downcase("ΣΣ", :greek)
"σς"

duplicate(объект, n)

Характеристики

duplicate(t(), non_neg_integer()) :: t()

Возвращает строку subject, продублированную n раз.

Встраивается компилятором.

Примеры

iex> String.duplicate("abc", 0)
""

iex> String.duplicate("abc", 1)
"abc"

iex> String.duplicate("abc", 2)
"abcabc"

ends_with?(строка, суффикс)

Характеристики

ends_with?(t(), t() | [t()]) :: boolean()

Возвращает true если string оканчивается на любой из указанных суффиксов.

suffixes может быть единственным суффиксом или списком суффиксов.

Примеры

iex> String.ends_with?("language", "age")
true
iex> String.ends_with?("language", ["youth", "age"])
true
iex> String.ends_with?("language", ["youth", "elixir"])
false

Пустой суффикс всегда будет соответствовать:

iex> String.ends_with?("language", "")
true
iex> String.ends_with?("language", ["", "other"])
true

equivalent?(строка1, строка2)

Характеристики

equivalent?(t(), t()) :: boolean()

Возвращает true если string1 канонически эквивалентна 'строка2'.

Она выполняет нормализацию формы канонического разложения (NFD) для строк перед сравнением. Эта функция эквивалентна:

String.normalize(string1, :nfd) == String.normalize(string2, :nfd)

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

Примеры

iex> String.equivalent?("abc", "abc")
true

iex> String.equivalent?("man\u0303ana", "mañana")
true

iex> String.equivalent?("abc", "ABC")
false

iex> String.equivalent?("nø", "nó")
false

first(строка)

Характеристики

first(t()) :: grapheme() | nil

Возвращает первый графем из UTF-8 строки, nil если строка пуста.

Примеры

iex> String.first("elixir")
"e"

iex> String.first("եոգլի")
"ե"

graphemes(строка)

Характеристики

graphemes(t()) :: [grapheme()]

Возвращает графемы Unicode в строке в соответствии с алгоритмом расширенного графема.

Алгоритм описан в Unicode Standard Annex #29, Unicode Text Segmentation.

Для получения подробной информации о кодовых точках и графемах обратитесь к документации модуля String.

Примеры

iex> String.graphemes("Ńaïve")
["Ń", "a", "ï", "v", "e"]

iex> String.graphemes("\u00e9")
["é"]

iex> String.graphemes("\u0065\u0301")
["é"]

jaro_distance(строка1, строка2)

Характеристики

jaro_distance(t(), t()) :: float()

Вычисляет расстояние Яро (подобие) между двумя строками.

Возвращает значение с плавающей запятой между 0.0 (соответствует отсутствию сходства) и 1.0 (является точным совпадением), представляющее расстояние Яро между string1 и string2.

Метрика расстояния Яро разработана и лучше всего подходит для коротких строк, таких как имена людей. Elixir использует эту функцию для предоставления функции «вы имели в виду?». Например, при вызове функции в модуле с ошибкой в имени функции мы пытаемся предложить наиболее похожую доступную функцию, если таковая имеется, на основе оценки jaro_distance/2.

Примеры

iex> String.jaro_distance("Dwayne", "Duane")
0.8222222222222223
iex> String.jaro_distance("even", "odd")
0.0
iex> String.jaro_distance("same", "same")
1.0

last(строка)

Характеристики

last(t()) :: grapheme() | nil

Возвращает последнюю графем из UTF-8 строки, nil если строка пуста.

Примеры

iex> String.last("elixir")
"r"

iex> String.last("եոգլի")
"ի"

length(строка)

Характеристики

length(t()) :: non_neg_integer()

Возвращает количество графемов Unicode в строке UTF-8.

Примеры

iex> String.length("elixir")
6

iex> String.length("եոգլի")
5

match?(строка, регулярное_выражение)

Характеристики

match?(t(), Regex.t()) :: boolean()

Проверяет, соответствует ли string заданному регулярному выражению.

Примеры

iex> String.match?("foo", ~r/foo/)
true

iex> String.match?("bar", ~r/foo/)
false

myers_difference(строка1, строка2)

Характеристики

myers_difference(t(), t()) :: [{:eq | :ins | :del, t()}]

Возвращает список ключевых слов, представляющий скрипт редактирования.

См. List.myers_difference/2 для получения дополнительной информации.

Примеры

iex> string1 = "fox hops over the dog"
iex> string2 = "fox jumps over the lazy cat"
iex> String.myers_difference(string1, string2)
[eq: "fox ", del: "ho", ins: "jum", eq: "ps over the ", del: "dog", ins: "lazy cat"]

next_codepoint(строка)

Характеристики

next_codepoint(t()) :: {codepoint(), t()} | nil

Возвращает следующий код символа в строке.

Результат — кортеж с кодом символа и остатком строки или nil в случае достижения конца строки.

Как и другие функции в модуле String, next_codepoint/1 работает с бинарными данными, которые являются невалидными UTF-8. Если строка начинается с последовательности байтов, которая не является валидной в кодировке UTF-8, первый элемент возвращаемого кортежа — бинарный объект с первым байтом.

Примеры

iex> String.next_codepoint("olá")
{"o", "lá"}

iex> invalid = "\x80\x80OK" # first two bytes are invalid in UTF-8
iex> {_, rest} = String.next_codepoint(invalid)
{<<128>>, <<128, 79, 75>>}
iex> String.next_codepoint(rest)
{<<128>>, "OK"}

Сравнение с бинарным сопоставлением шаблонов

Бинарное сопоставление шаблонов предоставляет аналогичный способ разбиения строки:

iex> <<codepoint::utf8, rest::binary>> = "Elixir"
"Elixir"
iex> codepoint
69
iex> rest
"lixir"

хотя и не полностью эквивалентен, поскольку codepoint представлен как целое число, а шаблон не будет соответствовать невалидному UTF-8.

Однако бинарное сопоставление шаблонов проще и эффективнее, поэтому выбирайте тот вариант, который лучше подходит для вашего случая использования.

next_grapheme(бинарный)

Характеристики

next_grapheme(t()) :: {grapheme(), t()} | nil

Возвращает следующий графемный символ в строке.

Результат — кортеж с графемным символом и остатком строки или nil в случае достижения конца строки.

Примеры

iex> String.next_grapheme("olá")
{"o", "lá"}

next_grapheme_size(строка)

Характеристики

next_grapheme_size(t()) :: {pos_integer(), t()} | nil

Возвращает размер следующего графемного символа.

Результат — кортеж с размером следующего графемного символа и остатком строки или nil в случае достижения конца строки.

Примеры

iex> String.next_grapheme_size("olá")
{1, "lá"}

normalize(строка, форма)

Преобразует все символы в string в форму нормализации Юникода, определенную значением form.

Невалидные коды Юникода пропускаются, и оставшаяся часть строки преобразуется. Если вы хотите, чтобы алгоритм останавливался и возвращался при обнаружении невалидного кода, используйте :unicode.characters_to_nfd_binary/1 и :unicode.characters_to_nfc_binary/1.

Формы

Поддерживаемые формы:

  • :nfd - Форма нормализации канонического разложения. Символы разлагаются по каноническому соответствию, а несколько комбинирующих символов упорядочиваются определенным образом.

  • :nfc - Форма нормализации канонического объединения. Символы разлагаются, а затем объединяются по каноническому соответствию.

Примеры

iex> String.normalize("yêṩ", :nfd)
"yêṩ"

iex> String.normalize("leña", :nfc)
"leña"

pad_leading(строка, количество, заполнение \\ [" "])

Характеристики

pad_leading(t(), non_neg_integer(), t() | [t()]) :: t()

Возвращает новую строку, заполненную ведущим заполнителем, состоящим из элементов из padding.

Передача списка строк в качестве padding возьмет один элемент из списка для каждого отсутствующего элемента. Если список короче, чем количество вставок, заполнение начнется снова с начала списка. Передача строки padding эквивалентна передаче списка графем в ней. Если padding не указано, по умолчанию используется пробел.

Когда count меньше или равно длине string, возвращается string.

Вызывает ArgumentError, если указанный padding содержит элемент, отличный от строки.

Примеры

iex> String.pad_leading("abc", 5)
"  abc"

iex> String.pad_leading("abc", 4, "12")
"1abc"

iex> String.pad_leading("abc", 6, "12")
"121abc"

iex> String.pad_leading("abc", 5, ["1", "23"])
"123abc"

pad_trailing(строка, количество, заполнение \\ [" "])

Характеристики

pad_trailing(t(), non_neg_integer(), t() | [t()]) :: t()

Возвращает новую строку, заполненную заключительным заполнителем, состоящим из элементов из padding.

Передача списка строк в качестве padding возьмет один элемент из списка для каждого отсутствующего элемента. Если список короче, чем количество вставок, заполнение начнется снова с начала списка. Передача строки padding эквивалентна передаче списка графем в ней. Если padding не указано, по умолчанию используется пробел.

Когда count меньше или равно длине string, возвращается string.

Вызывает ArgumentError, если указанный padding содержит элемент, отличный от строки.

Примеры

iex> String.pad_trailing("abc", 5)
"abc  "

iex> String.pad_trailing("abc", 4, "12")
"abc1"

iex> String.pad_trailing("abc", 6, "12")
"abc121"

iex> String.pad_trailing("abc", 5, ["1", "23"])
"abc123"

printable?(строка, предел_символов \\ :бесконечность)

Характеристики

printable?(t(), 0) :: true
printable?(t(), pos_integer() | :infinity) :: boolean()

Проверяет, содержит ли строка только печатные символы до character_limit.

Принимает необязательный character_limit в качестве второго аргумента. Если character_limit равно 0, эта функция вернет true.

Примеры

iex> String.printable?("abc")
true

iex> String.printable?("abc" <> <<0>>)
false

iex> String.printable?("abc" <> <<0>>, 2)
true

iex> String.printable?("abc" <> <<0>>, 0)
true

replace(подлежащая, шаблон, замена, опции \\ [])

Характеристики

replace(t(), pattern() | Regex.t(), t() | (t() -> t() | iodata()), keyword()) ::
  t()

Возвращает новую строку, созданную заменой вхождений pattern в subject на replacement.

subject всегда является строкой.

pattern может быть строкой, регулярным выражением или скомпилированным шаблоном.

replacement может быть строкой или функцией, которая получает совпавший шаблон и должна возвращать замену в виде строки или iodata.

По умолчанию заменяются все вхождения, но это поведение можно контролировать с помощью опции :global; см. раздел «Опции» ниже.

Опции

  • :global - (boolean) если true, все вхождения pattern заменяются на replacement, иначе заменяется только первое вхождение. По умолчанию true

Примеры

iex> String.replace("a,b,c", ",", "-")
"a-b-c"

iex> String.replace("a,b,c", ",", "-", global: false)
"a-b,c"

Шаблон также может быть списком строк, а замена также может быть функцией, которая получает совпадения:

iex> String.replace("a,b,c", ["a", "c"], fn <<char>> -> <<char + 1>> end)
"b,b,d"

Если шаблон является регулярным выражением, можно использовать \N или \g{N} в строке replacement для доступа к конкретному захвату в регулярном выражении:

iex> String.replace("a,b,c", ~r/,(.)/, ",\\1\\g{1}")
"a,bb,cc"

Обратите внимание, что мы должны были экранировать символ обратного слэша (т.е., мы использовали \\N вместо просто \N для экранирования обратного слэша; то же самое для \\g{N}). Указав \0, можно вставить всё совпадение в строку замены.

Также можно указать скомпилированный шаблон:

iex> pattern = :binary.compile_pattern(",")
iex> String.replace("a,b,c", pattern, "[]")
"a[]b[]c"

Если в качестве pattern\ предоставлена пустая строка, функция будет рассматривать её как неявную пустую строку между каждой графемой, и строка будет вставлена. Если в качестве replacement предоставлена пустая строка, возвращается subject:

iex> String.replace("ELIXIR", "", ".")
".E.L.I.X.I.R."

iex> String.replace("ELIXIR", "", "")
"ELIXIR"

replace_leading(строка, совпадение, замена)

Характеристики

replace_leading(t(), t(), t()) :: t()

Заменяет все ведущие вхождения match на replacement совпадения match в string.

Возвращает строку без изменений, если совпадений нет.

Если match равно "", эта функция вызывает исключение ArgumentError: это происходит потому, что эта функция заменяет все вхождения match в начале string, и невозможно заменить «несколько» вхождений "".

Примеры

iex> String.replace_leading("hello world", "hello ", "")
"world"
iex> String.replace_leading("hello hello world", "hello ", "")
"world"

iex> String.replace_leading("hello world", "hello ", "ola ")
"ola world"
iex> String.replace_leading("hello hello world", "hello ", "ola ")
"ola ola world"

replace_prefix(строка, совпадение, замена)

Характеристики

replace_prefix(t(), t(), t()) :: t()

Заменяет префикс в string на replacement, если он соответствует match.

Возвращает строку без изменений, если совпадения нет. Если match — пустая строка (""), replacement просто добавляется в начало string.

Примеры

iex> String.replace_prefix("world", "hello ", "")
"world"
iex> String.replace_prefix("hello world", "hello ", "")
"world"
iex> String.replace_prefix("hello hello world", "hello ", "")
"hello world"

iex> String.replace_prefix("world", "hello ", "ola ")
"world"
iex> String.replace_prefix("hello world", "hello ", "ola ")
"ola world"
iex> String.replace_prefix("hello hello world", "hello ", "ola ")
"ola hello world"

iex> String.replace_prefix("world", "", "hello ")
"hello world"

replace_suffix(строка, совпадение, замена)

Характеристики

replace_suffix(t(), t(), t()) :: t()

Заменяет суффикс в string на replacement, если он соответствует match.

Возвращает строку без изменений, если совпадения нет. Если match — пустая строка (""), replacement просто добавляется в конец string.

Примеры

iex> String.replace_suffix("hello", " world", "")
"hello"
iex> String.replace_suffix("hello world", " world", "")
"hello"
iex> String.replace_suffix("hello world world", " world", "")
"hello world"

iex> String.replace_suffix("hello", " world", " mundo")
"hello"
iex> String.replace_suffix("hello world", " world", " mundo")
"hello mundo"
iex> String.replace_suffix("hello world world", " world", " mundo")
"hello world mundo"

iex> String.replace_suffix("hello", "", " world")
"hello world"

replace_trailing(string, match, replacement)

Характеристики

replace_trailing(t(), t(), t()) :: t()

Заменяет все вхождения match в конце строки string на replacement.

Возвращает строку без изменений, если вхождений нет.

Если match равно "", эта функция вызывает исключение ArgumentError: это происходит потому, что эта функция заменяет все вхождения match в конце string, и невозможно заменить "множественные" вхождения "".

Примеры

iex> String.replace_trailing("hello world", " world", "")
"hello"
iex> String.replace_trailing("hello world world", " world", "")
"hello"

iex> String.replace_trailing("hello world", " world", " mundo")
"hello mundo"
iex> String.replace_trailing("hello world world", " world", " mundo")
"hello mundo mundo"

reverse(string)

Характеристики

reverse(t()) :: t()

Инвертирует графемы в заданной строке.

Примеры

iex> String.reverse("abcd")
"dcba"

iex> String.reverse("hello world")
"dlrow olleh"

iex> String.reverse("hello ∂og")
"go∂ olleh"

Обратите внимание, что повторное обращение к одной и той же строке не обязательно возвращает исходную строку:

iex> "̀e"
"̀e"
iex> String.reverse("̀e")
"è"
iex> String.reverse(String.reverse("̀e"))
"è"

В первом примере ударение стоит перед гласной, поэтому оно считается двумя графемами. Однако после первой инверсии ударение оказывается после гласной, становясь одной графемой. Повторное обращение вернёт её как одну графему.

slice(string, range)

Характеристики

slice(t(), Range.t()) :: t()

Возвращает подстроку от начала диапазона до конца диапазона.

Если начало диапазона не является допустимым смещением для заданной строки или диапазон отсортирован в обратном порядке, возвращается "".

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

Помните, что эта функция работает с графемами Юникода и рассматривает срезы как смещения графем. Если нужно разбить на отдельные байты, см. Kernel.binary_part/3.

Примеры

iex> String.slice("elixir", 1..3)
"lix"

iex> String.slice("elixir", 1..10)
"lixir"

iex> String.slice("elixir", 10..3)
""

iex> String.slice("elixir", -4..-1)
"ixir"

iex> String.slice("elixir", 2..-1)
"ixir"

iex> String.slice("elixir", -4..6)
"ixir"

iex> String.slice("elixir", -1..-4)
""

iex> String.slice("elixir", -10..-7)
""

iex> String.slice("a", 0..1500)
"a"

iex> String.slice("a", 1..1500)
""

slice(string, start, len)

Характеристики

slice(t(), integer(), non_neg_integer()) :: grapheme()

Возвращает подстроку, начинающуюся с смещения start, и длиной len.

Если смещение больше длины строки, возвращается "".

Помните, что эта функция работает с графемами Юникода и рассматривает срезы как смещения графем. Если нужно разбить на отдельные байты, см. Kernel.binary_part/3.

Примеры

iex> String.slice("elixir", 1, 3)
"lix"

iex> String.slice("elixir", 1, 10)
"lixir"

iex> String.slice("elixir", 10, 3)
""

iex> String.slice("elixir", -4, 4)
"ixir"

iex> String.slice("elixir", -10, 3)
""

iex> String.slice("a", 0, 1500)
"a"

iex> String.slice("a", 1, 1500)
""

iex> String.slice("a", 2, 1500)
""

split(binary)

Характеристики

split(t()) :: [t()]

Разделяет строку на подстроки по каждой графеме пробела Юникода с игнорированием начальных и конечных пробелов. Группы пробелов обрабатываются как одно вхождение. Разделения не происходят на неразрывном пробеле.

Примеры

iex> String.split("foo bar")
["foo", "bar"]

iex> String.split("foo" <> <<194, 133>> <> "bar")
["foo", "bar"]

iex> String.split(" foo   bar ")
["foo", "bar"]

iex> String.split("no\u00a0break")
["no\u00a0break"]

split(string, pattern, options \\ [])

Характеристики

split(t(), pattern() | Regex.t(), keyword()) :: [t()]

Разделяет строку на части на основе шаблона.

Возвращает список этих частей. Шаблон может быть строкой, списком строк, регулярным выражением или скомпилированным шаблоном.

Строка делится на максимально возможное количество частей по умолчанию, но это можно контролировать с помощью опции :parts.

Пустые строки удаляются из результата только если опция :trim установлена в true.

При использовании регулярного выражения в качестве шаблона строка делится с помощью Regex.split/3.

Опции

  • :parts (положительное целое число или :infinity) - строка делится максимум на столько частей, сколько указано в этой опции. Если :infinity, строка будет разделена на все возможные части. По умолчанию :infinity.

  • :trim (логическое значение) - если true, пустые строки удаляются из результирующего списка.

Эта функция также принимает все опции, принятые Regex.split/3, если pattern является регулярным выражением.

Примеры

Разделение со строковым шаблоном:

iex> String.split("a,b,c", ",")
["a", "b", "c"]

iex> String.split("a,b,c", ",", parts: 2)
["a", "b,c"]

iex> String.split(" a b c ", " ", trim: true)
["a", "b", "c"]

Список шаблонов:

iex> String.split("1,2 3,4", [" ", ","])
["1", "2", "3", "4"]

Регулярное выражение:

iex> String.split("a,b,c", ~r{,})
["a", "b", "c"]

iex> String.split("a,b,c", ~r{,}, parts: 2)
["a", "b,c"]

iex> String.split(" a b c ", ~r{\s}, trim: true)
["a", "b", "c"]

iex> String.split("abc", ~r{b}, include_captures: true)
["a", "b", "c"]

Скомпилированный шаблон:

iex> pattern = :binary.compile_pattern([" ", ","])
iex> String.split("1,2 3,4", pattern)
["1", "2", "3", "4"]

Разделение по пустой строке возвращает графемы:

iex> String.split("abc", "")
["", "a", "b", "c", ""]

iex> String.split("abc", "", trim: true)
["a", "b", "c"]

iex> String.split("abc", "", parts: 1)
["abc"]

iex> String.split("abc", "", parts: 3)
["", "a", "bc"]

Обратите внимание, что эта функция может разделять строку внутри или между графемами. Например, графема "é" состоит из символов "e" и острого ударения. Следующее разделит строку на две части:

iex> String.split(String.normalize("é", :nfd), "e")
["", "́"]

Однако, если "é" представляется одним символом "e с острым ударением", то это разделит строку всего на одну часть:

iex> String.split(String.normalize("é", :nfc), "e")
["é"]

split_at(string, position)

Характеристики

split_at(t(), integer()) :: {t(), t()}

Разделяет строку на две части по заданному смещению. При отрицательном смещении местоположение рассчитывается с конца строки.

Смещение ограничено длиной строки. Возвращает кортеж из двух элементов.

Примечание: помните, что эта функция разделяет строку по графемам, и для этого необходимо линейно пройтись по строке. Если нужно разделить строку или двоичное значение по количеству байтов, используйте Kernel.binary_part/3.

Примеры

iex> String.split_at("sweetelixir", 5)
{"sweet", "elixir"}

iex> String.split_at("sweetelixir", -6)
{"sweet", "elixir"}

iex> String.split_at("abc", 0)
{"", "abc"}

iex> String.split_at("abc", 1000)
{"abc", ""}

iex> String.split_at("abc", -1000)
{"", "abc"}

splitter(string, pattern, options \\ [])

Характеристики

splitter(t(), pattern(), keyword()) :: Enumerable.t()

Возвращает перечисляемый объект, который делит строку по требованию.

В отличие от split/3, который разделяет всю строку сразу.

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

Опции

  • :trim - если true, не выводить пустые шаблоны

Примеры

iex> String.splitter("1,2 3,4 5,6 7,8,...,99999", [" ", ","]) |> Enum.take(4)
["1", "2", "3", "4"]

iex> String.splitter("abcd", "") |> Enum.take(10)
["", "a", "b", "c", "d", ""]

iex> String.splitter("abcd", "", trim: true) |> Enum.take(10)
["a", "b", "c", "d"]

Также можно указать скомпилированный шаблон:

iex> pattern = :binary.compile_pattern([" ", ","])
iex> String.splitter("1,2 3,4 5,6 7,8,...,99999", pattern) |> Enum.take(4)
["1", "2", "3", "4"]

starts_with?(string, prefix)

Характеристики

starts_with?(t(), pattern()) :: boolean()

Возвращает true если string начинается с любого из заданных префиксов.

prefix может быть строкой, списком строк или скомпилированным шаблоном.

Примеры

iex> String.starts_with?("elixir", "eli")
true
iex> String.starts_with?("elixir", ["erlang", "elixir"])
true
iex> String.starts_with?("elixir", ["erlang", "ruby"])
false

Также можно указать скомпилированный шаблон:

iex> pattern = :binary.compile_pattern(["erlang", "elixir"])
iex> String.starts_with?("elixir", pattern)
true

Пустая строка всегда будет совпадать:

iex> String.starts_with?("elixir", "")
true
iex> String.starts_with?("elixir", ["", "other"])
true

to_atom(string)

Характеристики

to_atom(t()) :: atom()

Преобразует строку в атом.

Предупреждение: эта функция создаёт атомы динамически, и атомы не собираются сборщиком мусора. Поэтому string не должна быть недоверенной величиной, такой как вход, полученный из сокета или во время веб-запроса. Рассмотрите использование to_existing_atom/1 вместо этого.

По умолчанию максимальное количество атомов составляет 1_048_576. Это ограничение можно изменить с помощью параметра VM +t.

Максимальный размер атома составляет 255 символов Юникода.

Встроенная компилятором.

Примеры

iex> String.to_atom("my_atom")
:my_atom

to_charlist(string)

Характеристики

to_charlist(t()) :: charlist()

Преобразует строку в список символов.

Точнее, эта функция принимает двоичное значение UTF-8 и возвращает список его целочисленных кодов символов. Аналогично codepoints/1, за исключением того, что последний возвращает список кодов символов в виде строк.

Если вам нужно работать с байтами, обратите внимание на :binary модуль.

Примеры

iex> String.to_charlist("æß")
'æß'

to_existing_atom(string)

Характеристики

to_existing_atom(t()) :: atom()

Преобразует строку в существующий атом.

Максимальный размер атома составляет 255 символов Юникода.

Встроенная компилятором.

Примеры

iex> _ = :my_atom
iex> String.to_existing_atom("my_atom")
:my_atom

iex> String.to_existing_atom("this_atom_will_never_exist")
** (ArgumentError) argument error

to_float(string)

Характеристики

to_float(t()) :: float()

Возвращает число с плавающей точкой, представление которого в текстовом виде - string.

string должна быть строковым представлением числа с плавающей точкой, включающим десятичную точку. Для преобразования строки без десятичной точки в число с плавающей точкой используйте Float.parse/1. В противном случае будет вызвано исключение ArgumentError.

Встроенная компилятором.

Примеры

iex> String.to_float("2.2017764e+0")
2.2017764

iex> String.to_float("3.0")
3.0

String.to_float("3")
** (ArgumentError) argument error

to_integer(строка)

Характеристики

to_integer(t()) :: integer()

Возвращает целое число, текстовое представление которого string.

string должна быть строковым представлением целого числа. В противном случае будет поднято исключение ArgumentError. Если вы хотите проанализировать строку, которая может содержать неправильно отформатированное целое число, используйте Integer.parse/1.

Встроено компилятором.

Примеры

iex> String.to_integer("123")
123

Передача строки, не представляющей целое число, приводит к ошибке:

String.to_integer("invalid data")
** (ArgumentError) argument error

to_integer(строка, основание)

Характеристики

to_integer(t(), 2..36) :: integer()

Возвращает целое число, текстовое представление которого string в основании base.

Встроено компилятором.

Примеры

iex> String.to_integer("3FF", 16)
1023

trim(строка)

Характеристики

trim(t()) :: t()

Возвращает строку, из которой удалены все ведущие и хвостовые пробелы Unicode.

Примеры

iex> String.trim("\n  abc\n  ")
"abc"

trim(строка, для_удаления)

Характеристики

trim(t(), t()) :: t()

Возвращает строку, из которой удалены все ведущие и хвостовые символы to_trim.

Примеры

iex> String.trim("a  abc  a", "a")
"  abc  "

trim_leading(строка)

Характеристики

trim_leading(t()) :: t()

Возвращает строку, из которой удалены все ведущие пробелы Unicode.

Примеры

iex> String.trim_leading("\n  abc   ")
"abc   "

trim_leading(строка, для_удаления)

Характеристики

trim_leading(t(), t()) :: t()

Возвращает строку, из которой удалены все ведущие символы to_trim.

Примеры

iex> String.trim_leading("__ abc _", "_")
" abc _"

iex> String.trim_leading("1 abc", "11")
"1 abc"

trim_trailing(строка)

Характеристики

trim_trailing(t()) :: t()

Возвращает строку, из которой удалены все хвостовые пробелы Unicode.

Примеры

iex> String.trim_trailing("   abc\n  ")
"   abc"

trim_trailing(строка, для_удаления)

Характеристики

trim_trailing(t(), t()) :: t()

Возвращает строку, из которой удалены все хвостовые символы to_trim.

Примеры

iex> String.trim_trailing("_ abc __", "_")
"_ abc "

iex> String.trim_trailing("abc 1", "11")
"abc 1"

upcase(строка, режим \\ :default)

Характеристики

upcase(t(), :default | :ascii | :greek) :: t()

Преобразует все символы в данной строке в верхний регистр в соответствии с mode.

mode может быть :default, :ascii или :greek. Режим :default учитывает все неявные преобразования, описанные в стандарте Unicode. Режим :ascii преобразует только буквы от a до z в верхний регистр. Режим :greek включает контекстно-зависимые отображения, найденные в греческом языке.

Примеры

iex> String.upcase("abcd")
"ABCD"

iex> String.upcase("ab 123 xpto")
"AB 123 XPTO"

iex> String.upcase("olá")
"OLÁ"

Режим :ascii игнорирует символы Unicode и обеспечивает более высокую производительность, когда вы знаете, что строка содержит только символы ASCII:

iex> String.upcase("olá", :ascii)
"OLá"

valid?(строка)

Характеристики

valid?(t()) :: boolean()

Проверяет, содержит ли string только допустимые символы.

Примеры

iex> String.valid?("a")
true

iex> String.valid?("ø")
true

iex> String.valid?(<<0xFFFF::16>>)
false

iex> String.valid?(<<0xEF, 0xB7, 0x90>>)
true

iex> String.valid?("asd" <> <<0xFFFF::16>>)
false

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.10.4/String.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API