String
Строки в Elixir представляют собой закодированные в UTF-8 двоичные данные.
Строки в Elixir — это последовательность символов Юникода, обычно заключённые в двойные кавычки, такие как "hello" и "héllò".
В случае необходимости включить двойную кавычку в строку, её нужно экранировать обратной косой чертой, например: "this is a string with \"double quotes\"".
Вы можете конкатенировать две строки с помощью оператора <>/2:
iex> "hello" <> " " <> "world" "hello world"
Функции в этом модуле работают в соответствии со стандартом Юникод, версия 15.0.0.
Интерполяция
Строки в Elixir также поддерживают интерполяцию. Это позволяет разместить некоторое значение посреди строки, используя синтаксис #{}:
iex> name = "joe"
iex> "hello #{name}"
"hello joe"
Любое выражение Elixir допустимо внутри интерполяции. Если задана строка, строка интерполируется как есть. Если задано любое другое значение, Elixir попытается преобразовать его в строку, используя протокол String.Chars. Это позволяет, например, вывести целое число из интерполяции:
iex> "2 + 2 = #{2 + 2}"
"2 + 2 = 4"
В случае, если значение, которое вы хотите интерполировать, не может быть преобразовано в строку, поскольку у него нет человекочитаемого текстового представления, будет выброшено исключение протокола.
Экранированные символы
Помимо возможности экранировать двойные кавычки обратной косой чертой, строки также поддерживают следующие экранированные символы:
-
\0- Нулевой байт -
\a- Звуковой сигнал -
\b- Возврат на одну позицию назад -
\t- Горизонтальная табуляция -
\n- Перевод строки -
\v- Вертикальная табуляция -
\f- Форматирование страницы -
\r- Возврат каретки -
\e- Экранирование команды -
\s- Пробел -
\#- Возвращает символ#, пропуская интерполяцию -
\\- Обратная косая черта -
\xNN- Байты, представленные в шестнадцатеричном форматеNN -
\uNNNN- Кодовая точка Юникода, представленная вNNNN -
\u{NNNNNN}- Кодовая точка Юникода, представленная вNNNNNN
Обратите внимание, что в Elixir строках обычно не рекомендуется использовать \xNN, так как введение недействительной последовательности байтов сделает строку недействительной. Если вам необходимо ввести символ по его шестнадцатеричному представлению, лучше всего работать с кодовыми точками Юникода, например \uNNNN. На самом деле, понимание кодовых точек Юникода может быть важным при выполнении низкоуровневых манипуляций со строками, поэтому давайте рассмотрим их подробно далее.
Юникод и кодовые точки
Для обеспечения осмысленного обмена данными между компьютерами на разных языках необходим стандарт, чтобы единицы и нули на одной машине означали то же самое, когда они передаются на другую. Стандарт Юникод служит официальным реестром практически всех известных нам символов: сюда входят символы из классических и исторических текстов, эмодзи, а также символы форматирования и управления.
Юникод организует все символы в своем наборе в таблицы кодов, и каждому символу присваивается уникальный числовой индекс. Этот числовой индекс известен как кодовая точка.
В Elixir вы можете использовать ? перед литералом символа, чтобы увидеть его кодовую точку:
iex> ?a 97 iex> ?ł 322
Обратите внимание, что большинство таблиц кодов Юникода будут ссылаться на кодовую точку по ее шестнадцатеричному (hex) представлению, например, 97 переводится как 0061 в шестнадцатеричном формате, и мы можем представить любой символ Юникода в строке Elixir с помощью экранированного символа \u и его кодовой точки:
iex> "\u0061" === "a" true iex> 0x0061 = 97 = ?a 97
Шестнадцатеричное представление также поможет вам найти информацию о кодовой точке, например, https://codepoints.net/U+0061 содержит справочный лист обо всем, что относится к строчной a, также известной как кодовая точка 97. Помните, что вы можете получить шестнадцатеричное представление числа, вызвав Integer.to_string/2:
iex> Integer.to_string(?a, 16) "61"
Кодировка UTF-8 и кодировки
Теперь, когда мы понимаем, что такое стандарт Юникод и что такое кодовые точки, мы наконец можем поговорить о кодировках. В то время как кодовая точка — это что мы храним, кодировка — это как мы это храним: кодировка — это реализация. Другими словами, нам нужен механизм для преобразования числовых кодовых точек в байты, чтобы их можно было хранить в памяти, записывать на диск и т. д.
Elixir использует UTF-8 для кодирования строк, что означает, что кодовые точки кодируются как последовательность байтов по 8 бит. UTF-8 — это кодировка символов с переменной длиной, которая использует от одного до четырех байтов для хранения каждой кодовой точки. Она способна кодировать все допустимые кодовые точки Юникода. Посмотрим пример:
iex> string = "héllo" "héllo" iex> String.length(string) 5 iex> byte_size(string) 6
Хотя в строке выше 5 символов, она использует 6 байтов, так как для представления символа é используются два байта.
Кластеры графем
Этот модуль также работает с понятием кластера графем (в дальнейшем упоминается как графемы). Графемы могут состоять из нескольких кодовых точек, которые читатели могут воспринимать как один символ. Например, «é» можно представить как один символ «e с острым ударением», как показано выше в строке "héllo", или как букву «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 к стандарту Юникод.
Для преобразования двоичных данных в другую кодировку и для механизмов нормализации Юникода см. модуль :unicode Erlang.
Операции со строками и двоичными данными
Для работы в соответствии со стандартом Юникод многие функции в этом модуле работают за линейное время, так как им нужно пройти по всей строке, учитывая соответствующие кодовые точки Юникода.
Например, 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
Модификатор utf8 также доступен внутри двоичного синтаксиса <<>>. Он может использоваться для поиска кодовых точек вне двоичных данных/строки:
iex> <<eacute::utf8>> = "é" iex> eacute 233
Вы также можете полностью преобразовать строку в список целых кодовых точек, известных в Elixir как "charlists", вызвав String.to_charlist/1:
iex> String.to_charlist("héllo")
[104, 233, 108, 108, 111]
Если вам нужно увидеть основанные байты строки вместо её кодовых точек, то распространённый способ — это конкатенация нулевого байта <<0>> к ней:
iex> "héllo" <> <<0>> <<104, 195, 169, 108, 108, 111, 0>>
В качестве альтернативы, вы можете просмотреть двоичное представление строки, передав опцию в IO.inspect/2:
IO.inspect("héllo", binaries: :as_binaries)
#=> <<104, 195, 169, 108, 108, 111>>
Самосинхронизация
Кодировка UTF-8 является самосинхронизирующейся. Это означает, что если встречаются некорректные данные (т. е. данные, не соответствующие определению кодировки), нужно отклонить только одну кодовую точку.
Этот модуль полагается на это свойство, чтобы игнорировать такие недопустимые символы. Например, length/1 вернёт правильный результат, даже если в него будет подана некорректная кодовая точка.
Другими словами, этот модуль ожидает, что некорректные данные будут обнаружены где-то ещё, обычно при получении данных из внешнего источника. Например, драйвер, который считывает строки из базы данных, будет отвечать за проверку правильности кодировки. String.chunk/2 может использоваться для разделения строки на корректные и некорректные части.
Компиляция двоичных шаблонов
Многие функции в этом модуле работают с шаблонами. Например, String.split/3 может разделить строку на несколько строк, задав шаблон. Этот шаблон может быть строкой, списком строк или скомпилированным шаблоном:
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()
Несколько символов Юникода, которые могут восприниматься читателями как один символ.
- t()
Двоичные данные, закодированные в UTF-8.
Функции
- at(string, position)
Возвращает графемное значение в
positionуказанной UTF-8string. Если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(arg)
Возвращает следующую кодовую точку в строке.
- next_grapheme(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, length)
Возвращает подстроку, начинающуюся со смещения
start, и имеющую заданнуюlength.- 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, algorithm \\ :default)
Проверяет, содержит ли
stringтолько допустимые символы.
codepoint()Source
@type codepoint() :: t()
Один единственный символ Unicode, закодированный в UTF-8. Он может занимать один или несколько байтов.
grapheme()Source
@type grapheme() :: t()
Несколько символов Unicode, которые могут восприниматься читателями как один символ.
pattern()Source
@type pattern() :: t() | [nonempty_binary()] | (compiled_search_pattern :: :binary.cp())
Шаблон, используемый в функциях, таких как replace/4 и split/3.
Он должен быть одним из следующих:
- строка
- пустой список
- список, содержащий непустые строки
- скомпилированный шаблон поиска, созданный с помощью
:binary.compile_pattern/1
t()Source
@type t() :: binary()
Бинарное представление UTF-8.
Типы String.t() и binary() эквивалентны для инструментов анализа. Хотя для тех, кто читает документацию, String.t() подразумевает, что это бинарное представление UTF-8.
at(строка, позиция)Source
@spec 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)Source
@spec 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)Source
@spec capitalize(t(), :default | :ascii | :greek | :turkic) :: t()
Преобразует первый символ в заданной строке в верхний регистр, а остальные — в нижний регистр в соответствии с mode.
mode может быть :default, :ascii, :greek или :turkic. Режим :default учитывает все неявные преобразования, описанные в стандарте Unicode. Режим :ascii преобразует только буквы от A до Z в верхний регистр. Режим :greek включает контекстно-зависимые преобразования, встречающиеся в греческом языке. Режим :turkic корректно обрабатывает букву i с вариантом без точки.
Примеры
iex> String.capitalize("abcd")
"Abcd"
iex> String.capitalize("fin")
"Fin"
iex> String.capitalize("olá")
"Olá" chunk(строка, атрибут)Source
@spec 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(строка)Source
@spec codepoints(t()) :: [codepoint()]
Возвращает список кодовых точек, закодированных как строки.
Чтобы получить кодовые точки в их естественном целочисленном представлении, см. to_charlist/1. Подробнее о кодовых точках и графемах см. документацию модуля String.
Примеры
iex> String.codepoints("olá")
["o", "l", "á"]
iex> String.codepoints("оптими зации")
["о", "п", "т", "и", "м", "и", " ", "з", "а", "ц", "и", "и"]
iex> String.codepoints("ἅἪῼ")
["ἅ", "Ἢ", "ῼ"]
iex> String.codepoints("\u00e9")
["é"]
iex> String.codepoints("\u0065\u0301")
["e", "́"] contains?(строка, содержимое)Source
@spec contains?(t(), [t()] | pattern()) :: boolean()
Проверяет, содержит ли string какие-либо из указанных contents.
contents может быть строкой, списком строк или скомпилированным шаблоном. Если contents является списком, эта функция проверяет, является ли какая-либо строка в contents частью string.
Поиск строки в списке
Если нужно проверить, содержится ли
stringвcontents, гдеcontentsявляется списком, используйтеEnum.member?(contents, string)вместо этого.
Примеры
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
Пустой список никогда не будет совпадать:
iex> String.contains?("elixir of life", [])
false
iex> String.contains?("", [])
false
Обратите внимание, что эта функция может находить совпадения внутри или между графемами. Например, рассмотрим графему «é», которая состоит из символов «e» и острого акцента. Следующее выражение вернёт true:
iex> String.contains?(String.normalize("é", :nfd), "e")
true
Однако, если «é» представлена одним символом «e с острым акцентом», то она вернёт false:
iex> String.contains?(String.normalize("é", :nfc), "e")
false downcase(строка, режим \\ :default)Source
@spec downcase(t(), :default | :ascii | :greek | :turkic) :: t()
Преобразует все символы в заданной строке в нижний регистр в соответствии с mode.
mode может быть :default, :ascii, :greek или :turkic. Режим :default учитывает все неявные преобразования, описанные в стандарте Unicode. Режим :ascii преобразует только буквы от A до Z в нижний регистр. Режим :greek включает контекстно-зависимые преобразования, встречающиеся в греческом языке. Режим :turkic корректно обрабатывает букву i с вариантом без точки.
Примеры
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)
"σς"
И режим :turkic корректно обрабатывает букву i с вариантом без точки:
iex> String.downcase("Iİ")
"ii̇"
iex> String.downcase("Iİ", :turkic)
"ıi" duplicate(объект, n)Source
@spec 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?(строка, суффикс)Source
@spec 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)Source
@spec equivalent?(t(), t()) :: boolean()
Возвращает true, если string1 канонически эквивалентно string2.
Выполняет нормализацию в форме канонического разложения (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(строка)Source
@spec first(t()) :: grapheme() | nil
Возвращает первую графему из UTF-8 строки, nil если строка пуста.
Примеры
iex> String.first("elixir")
"e"
iex> String.first("եոգլի")
"ե"
iex> String.first("")
nil graphemes(строка)Source
@spec 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(string1, string2)Source
@spec 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(string)Source
@spec last(t()) :: grapheme() | nil
Возвращает последнюю графему из строки UTF-8, nil если строка пустая.
Он перебирает всю строку, чтобы найти её последнюю графему.
Примеры
iex> String.last("")
nil
iex> String.last("elixir")
"r"
iex> String.last("եոգլի")
"ի" length(string)Source
@spec length(t()) :: non_neg_integer()
Возвращает количество символов Юникода в строке UTF-8.
Примеры
iex> String.length("elixir")
6
iex> String.length("եոգլի")
5 match?(string, regex)Source
@spec match?(t(), Regex.t()) :: boolean()
Проверяет, соответствует ли string заданному регулярному выражению.
Примеры
iex> String.match?("foo", ~r/foo/)
true
iex> String.match?("bar", ~r/foo/)
false
Elixir также предоставляет текстовый оператор соответствия =~/2 и функцию Regex.match?/2 в качестве альтернатив для проверки строк на соответствие регулярным выражениям.
myers_difference(string1, string2)Source
@spec 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(arg)Source
@spec 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(string)Source
@spec next_grapheme(t()) :: {grapheme(), t()} | nil Возвращает следующую графему в строке.
Результат — кортеж с графемой и остатком строки или nil в случае достижения конца строки.
Примеры
iex> String.next_grapheme("olá")
{"o", "lá"}
iex> String.next_grapheme("")
nil normalize(string, form)Source
Преобразует все символы в string в форму нормализации Юникода, определяемую form.
Недействительные коды символов Юникода пропускаются, а оставшаяся часть строки преобразуется. Если вы хотите, чтобы алгоритм останавливался и возвращался при недействительном коде символа, используйте :unicode.characters_to_nfd_binary/1, :unicode.characters_to_nfc_binary/1, :unicode.characters_to_nfkd_binary/1 и :unicode.characters_to_nfkc_binary/1 вместо этого.
Формы нормализации :nfkc и :nfkd не следует слепо применять к произвольному тексту. Поскольку они стирают многие различия в форматировании, они будут препятствовать обращению преобразования из и в многие старые наборы символов.
Формы
Поддерживаемые формы:
:nfd- Нормальная форма канонического разложения. Символы разлагаются по каноническому эквиваленту, а несколько объединяющих символов упорядочиваются в определённом порядке.:nfc- Нормальная форма канонического объединения. Символы разлагаются, а затем объединяются по каноническому эквиваленту.:nfkc- Нормальная форма совместимого разложения. Символы разлагаются по совместимому эквиваленту, а несколько объединяющих символов упорядочиваются в определённом порядке.:nfkc- Нормальная форма совместимого объединения. Символы разлагаются, а затем объединяются по совместимому эквиваленту.
Примеры
iex> String.normalize("yêṩ", :nfd)
"yêṩ"
iex> String.normalize("leña", :nfc)
"leña"
iex> String.normalize("fi", :nfkd)
"fi"
iex> String.normalize("fi", :nfkc)
"fi" pad_leading(string, count, padding \\ [" "])Source
@spec 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(string, count, padding \\ [" "])Source
@spec 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?(string, character_limit \\ :infinity)Source
@spec printable?(t(), 0) :: true
@spec 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(subject, pattern, replacement, options \\ [])Source
@spec 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"
Обратите внимание, что эта функция может заменять внутри или между графемами. Например, рассмотрим графему «é», состоящую из символов «e» и острой буквы. Следующее заменит только букву «e», перенеся острую букву на букву «o»:
iex> String.replace(String.normalize("é", :nfd), "e", "o")
"ó"
Однако, если «é» представлено одним символом «e с острой» буквой, то оно не будет заменено:
iex> String.replace(String.normalize("é", :nfc), "e", "o")
"é" replace_leading(string, match, replacement)Source
@spec 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/3 для получения дополнительной информации и примеров.
replace_prefix(string, match, replacement)Source
@spec 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/3 для получения дополнительной информации и примеров.
replace_suffix(string, match, replacement)Source
@spec 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/3 для получения дополнительной информации и примеров.
replace_trailing(string, match, replacement)Source
@spec replace_trailing(t(), t(), t()) :: t()
Заменяет все вхождения match на replacement в string.
Возвращает строку без изменений, если вхождений нет.
Если 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"
Эта функция может заменять переходы между графемами. См. replace/3 для получения дополнительной информации и примеров.
reverse(string)Source
@spec 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)Source
@spec slice(t(), Range.t()) :: t()
Возвращает подстроку от смещения, заданного началом диапазона, до смещения, заданного концом диапазона.
Если начало диапазона не является допустимым смещением для данной строки или диапазон задан в обратном порядке, возвращается "".
Если начало или конец диапазона отрицательны, вся строка сначала просматривается, чтобы преобразовать отрицательные индексы в положительные.
Помните, что эта функция работает с графемами Юникода и рассматривает срезы как смещения графем. Если вы хотите разделить по байтам, проверьте Kernel.binary_part/3 или Kernel.binary_slice/2.
Примеры
iex> String.slice("elixir", 1..3)
"lix"
iex> String.slice("elixir", 1..10)
"lixir"
iex> String.slice("elixir", -4..-1)
"ixir"
iex> String.slice("elixir", -4..6)
"ixir"
iex> String.slice("elixir", -100..100)
"elixir"
Для диапазонов, где start > stop, нужно явно указать возрастание:
iex> String.slice("elixir", 2..-1//1)
"ixir"
iex> String.slice("elixir", 1..-2//1)
"lixi"
Вы можете использовать ../0 как сокращение для 0..-1//1, которое возвращает всю строку, как есть:
iex> String.slice("elixir", ..)
"elixir"
Шаг может быть любым положительным числом. Например, чтобы получить каждый 2-й символ строки:
iex> String.slice("elixir", 0..-1//2)
"eii"
Если первая позиция находится после конца строки или после последней позиции диапазона, возвращается пустая строка:
iex> String.slice("elixir", 10..3)
""
iex> String.slice("a", 1..1500)
"" slice(string, start, length)Source
@spec slice(t(), integer(), non_neg_integer()) :: grapheme()
Возвращает подстроку, начиная со смещения start, и заданной length длины.
Если смещение больше длины строки, возвращается "".
Помните, что эта функция работает с графемами Юникода и рассматривает срезы как смещения графем. Если вы хотите разделить по байтам, проверьте Kernel.binary_part/3 или Kernel.binary_slice/3.
Примеры
iex> String.slice("elixir", 1, 3)
"lix"
iex> String.slice("elixir", 1, 10)
"lixir"
iex> String.slice("elixir", 10, 3)
""
Если начальная позиция отрицательная, она нормализуется относительно длины строки и ограничена значением 0:
iex> String.slice("elixir", -4, 4)
"ixir"
iex> String.slice("elixir", -10, 3)
"eli"
Если начальная позиция больше длины строки, возвращается пустая строка:
iex> String.slice("elixir", 10, 1500)
"" split(binary)Source
@spec 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 \\ [])Source
@spec split(t(), pattern() | Regex.t(), keyword()) :: [t()]
Разделяет строку на части на основе шаблона.
Возвращает список этих частей.
Шаблон pattern может быть строкой, списком строк, регулярным выражением или скомпилированным шаблоном.
Строка разделяется на максимальное количество частей по умолчанию, но это можно контролировать с помощью опции :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)Source
@spec 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 \\ [])Source
@spec 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)Source
@spec starts_with?(t(), t() | [t()]) :: 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> String.starts_with?("elixir", "")
true
iex> String.starts_with?("elixir", ["", "other"])
true
Пустой список никогда не будет соответствовать:
iex> String.starts_with?("elixir", [])
false
iex> String.starts_with?("", [])
false to_atom(string)Source
@spec to_atom(t()) :: atom()
Преобразует строку в существующий атом или создаёт новый.
Предупреждение: эта функция динамически создаёт атомы, и атомы не подлежат сборке мусора. Поэтому string не должен быть недоверенным значением, таким как входные данные, полученные из сокета или во время веб-запроса. Рассмотрите использование to_existing_atom/1 вместо этого.
По умолчанию максимальное количество атомов составляет 1_048_576. Этот лимит можно увеличить или уменьшить с помощью опции виртуальной машины +t.
Максимальный размер атома составляет 255 точек кода Юникода.
Встраивается компилятором.
Примеры
iex> String.to_atom("my_atom")
:my_atom to_charlist(string)Source
@spec to_charlist(t()) :: charlist()
Преобразует строку в список символов.
В частности, эта функция принимает двоичные данные с кодировкой UTF-8 и возвращает список целых чисел их кодовых точек. Она аналогична codepoints/1, за исключением того, что последняя возвращает список кодовых точек в виде строк.
В случае необходимости работы с байтами, взгляните на :binary модуль.
Примеры
iex> String.to_charlist("foo")
~c"foo" to_existing_atom(string)Source
@spec to_existing_atom(t()) :: atom()
Преобразует строку в существующий атом или вызывает исключение, если атом не существует.
Максимальный размер атома составляет 255 точек кода Юникода. Вызывает исключение ArgumentError, если атом не существует.
Встраивается компилятором.
Атомы и модули
Поскольку Elixir — это компилируемый язык, атомы, определённые в модуле, существуют только после загрузки указанного модуля, что обычно происходит при выполнении любой функции в модуле. Поэтому рекомендуется вызывать
String.to_existing_atom/1только для преобразования атомов, определённых в модуле, выполняющем вызовto_existing_atom/1.Для безопасного создания имени модуля из строки рекомендуется использовать
Module.safe_concat/1.
Примеры
iex> _ = :my_atom
iex> String.to_existing_atom("my_atom")
:my_atom to_float(string)Source
@spec 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(string)Source
@spec 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(string, base)Source
@spec to_integer(t(), 2..36) :: integer()
Возвращает целое число, текстовое представление которого string в системе счисления base.
Встраивается компилятором.
Примеры
iex> String.to_integer("3FF", 16)
1023 trim(строка)Исходный код
@spec trim(t()) :: t()
Возвращает строку, из которой удалены все ведущие и хвостовые Unicode-пробелы.
Примеры
iex> String.trim("\n abc\n ")
"abc" trim(строка, удаляемые)Исходный код
@spec trim(t(), t()) :: t()
Возвращает строку, из которой удалены все ведущие и хвостовые to_trim символы.
Примеры
iex> String.trim("a abc a", "a")
" abc " trim_leading(строка)Исходный код
@spec trim_leading(t()) :: t()
Возвращает строку, из которой удалены все ведущие Unicode-пробелы.
Примеры
iex> String.trim_leading("\n abc ")
"abc " trim_leading(строка, удаляемые)Исходный код
@spec trim_leading(t(), t()) :: t()
Возвращает строку, из которой удалены все ведущие to_trim символы.
Примеры
iex> String.trim_leading("__ abc _", "_")
" abc _"
iex> String.trim_leading("1 abc", "11")
"1 abc" trim_trailing(строка)Исходный код
@spec trim_trailing(t()) :: t()
Возвращает строку, из которой удалены все хвостовые Unicode-пробелы.
Примеры
iex> String.trim_trailing(" abc\n ")
" abc" trim_trailing(строка, удаляемые)Исходный код
@spec trim_trailing(t(), t()) :: t()
Возвращает строку, из которой удалены все хвостовые to_trim символы.
Примеры
iex> String.trim_trailing("_ abc __", "_")
"_ abc "
iex> String.trim_trailing("abc 1", "11")
"abc 1" upcase(строка, режим \\ :default)Исходный код
@spec upcase(t(), :default | :ascii | :greek | :turkic) :: t()
Преобразует все символы в заданной строке в верхний регистр в соответствии с mode.
mode может быть :default, :ascii, :greek или :turkic. Режим :default учитывает все неявные преобразования, описанные в стандарте Unicode. :ascii преобразует только буквы от a до z в верхний регистр. :greek включает контекстно-зависимые отображения, найденные в греческом языке. :turkic правильно обрабатывает букву i с вариантом без точки.
Примеры
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á"
И :turkic правильно обрабатывает букву i с вариантом без точки:
iex> String.upcase("ıi")
"II"
iex> String.upcase("ıi", :turkic)
"Iİ" valid?(строка, алгоритм \\ :default)Исходный код
Проверяет, содержит ли string только допустимые символы.
algorithm может быть :default или :fast_ascii. Оба алгоритма эквивалентны с точки зрения валидации (они всегда будут давать одинаковый результат), но :fast_ascii может обеспечить значительные преимущества производительности в определенных сценариях.
Если все из следующих условий выполняются, вы можете поэкспериментировать с алгоритмом :fast_ascii, чтобы увидеть, дает ли он преимущества производительности в вашем конкретном сценарии:
- Вы используете Erlang/OTP 26 или более позднюю версию на 64-битной платформе
- Вы ожидаете, что большинство ваших строк будет длиннее ~64 байт
- Вы ожидаете, что большинство ваших строк будет содержать в основном символы ASCII
Обратите внимание, что алгоритм :fast_ascii не влияет на корректность, вы можете ожидать, что результат String.valid?/2 будет одинаковым независимо от алгоритма. Единственное ожидаемое различие — производительность, которая, как ожидается, будет увеличиваться примерно линейно с длиной строки по сравнению с алгоритмом :default.
Примеры
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
iex> String.valid?("a", :fast_ascii)
true
iex> String.valid?(4)
** (FunctionClauseError) no function clause matching in String.valid?/2
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.15.4/String.html