Spec-Zone.ru › Nim 1

strutils

Модуль system определяет несколько общих функций для работы со строками, таких как:

  • $ для преобразования других типов данных в строки
  • & для конкатенации строк
  • add для добавления нового символа или строки к существующей
  • in (псевдоним для contains) и notin для проверки наличия символа в строке

Этот модуль расширяет это, предоставляя дополнительную функциональность в виде процедур, итераторов и шаблонов для строк.

import strutils

let
  numbers = @[867, 5309]
  multiLineString = "first line\nsecond line\nthird line"

let jenny = numbers.join("-")
assert jenny == "867-5309"

assert splitLines(multiLineString) ==
       @["first line", "second line", "third line"]
assert split(multiLineString) == @["first", "line", "second",
                                   "line", "third", "line"]
assert indent(multiLineString, 4) ==
       "    first line\n    second line\n    third line"
assert 'z'.repeat(5) == "zzzzz"

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

import strutils
from sequtils import map

let jenny = "867-5309"
assert jenny.split('-').map(parseInt) == @[867, 5309]

assert "Beetlejuice".indent(1).repeat(3).strip ==
       "Beetlejuice Beetlejuice Beetlejuice"

Этот модуль доступен для цели JavaScript.


См. также:

  • модуль strformat для интерполяции и форматирования строк
  • модуль unicode для обработки Unicode UTF-8
  • модуль sequtils для операций над контейнерными типами (включая строки)
  • модуль parsecsv для высокопроизводительного парсера CSV
  • модуль parseutils для низкоуровневого парсинга токенов, чисел, идентификаторов и т. д.
  • модуль parseopt для парсинга командной строки
  • модуль pegs для поддержки PEG (Parsing Expression Grammar)
  • модуль strtabs для эффективных хеш-таблиц (словари в некоторых языках программирования), сопоставляющих строки со строками
  • модуль ropes для типа данных rope, который может эффективно представлять очень длинные строки
  • модуль re для поддержки регулярных выражений (regex)
  • strscans для scanf и scanp макросов, которые предлагают более простой способ извлечения подстрок, чем регулярные выражения

Импорты

parseutils, math, algorithm, macros, unicode, since

Типы

SkipTable = array[char, int]
Исходный код Изменить
FloatFormatMode = enum
  ffDefault,                ## use the shorter floating point notation
  ffDecimal,                ## use decimal floating point notation
  ffScientific               ## use scientific notation (using ``e`` character)
различные режимы форматирования чисел с плавающей точкой Исходный код Изменить
BinaryPrefixMode = enum
  bpIEC, bpColloquial
различные имена двоичных префиксов Исходный код Изменить

Константы

Whitespace = {' ', '\t', '\v', '\c', '\n', '\f'}
Все символы, считающиеся пробелами (пробел, табуляция, вертикальная табуляция, возврат каретки, перевод строки, подача формы) Исходный код Изменить
Letters = {'A'..'Z', 'a'..'z'}
набор букв Исходный код Изменить
Digits = {'0'..'9'}
набор цифр Исходный код Изменить
HexDigits = {'0'..'9', 'A'..'F', 'a'..'f'}
набор шестнадцатеричных цифр Исходный код Изменить
IdentChars = {'a'..'z', 'A'..'Z', '0'..'9', '_'}
набор символов, из которых может состоять идентификатор Исходный код Изменить
IdentStartChars = {'a'..'z', 'A'..'Z', '_'}
набор символов, с которых может начинаться идентификатор Исходный код Изменить
Newlines = {'\c', '\n'}
набор символов, с которых может начинаться символ завершения новой строки (возврат каретки, перевод строки) Исходный код Изменить
AllChars = {'\x00'..'\xFF'}

Набор со всеми возможными символами.

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

let invalid = AllChars - Digits
doAssert "01234".find(invalid) == -1
doAssert "01A34".find(invalid) == 2
Исходный код Изменить

Процедуры

proc isAlphaAscii(c: char): bool {...}{.noSideEffect, gcsafe,
                                   extern: "nsuIsAlphaAsciiChar", raises: [],
                                   tags: [].}

Проверяет, является ли символ c буквенным.

Проверяет только символы a-z, A-Z ASCII. Используйте модуль Unicode для поддержки UTF-8.

Пример:

doAssert isAlphaAscii('e') == true
doAssert isAlphaAscii('E') == true
doAssert isAlphaAscii('8') == false
Исходный код Изменить
proc isAlphaNumeric(c: char): bool {...}{.noSideEffect, gcsafe,
                                     extern: "nsuIsAlphaNumericChar",
                                     raises: [], tags: [].}

Проверяет, является ли c буквенно-цифровым.

Проверяет только символы a-z, A-Z, 0-9 ASCII.

Пример:

doAssert isAlphaNumeric('n') == true
doAssert isAlphaNumeric('8') == true
doAssert isAlphaNumeric(' ') == false
Исходный код Изменить
proc isDigit(c: char): bool {...}{.noSideEffect, gcsafe, extern: "nsuIsDigitChar",
                              raises: [], tags: [].}

Проверяет, является ли c числом.

Проверяет только символы 0-9 ASCII.

Пример:

doAssert isDigit('n') == false
doAssert isDigit('8') == true
Исходный код Изменить
proc isSpaceAscii(c: char): bool {...}{.noSideEffect, gcsafe,
                                   extern: "nsuIsSpaceAsciiChar", raises: [],
                                   tags: [].}
Проверяет, является ли c символом пробела.

Пример:

doAssert isSpaceAscii('n') == false
doAssert isSpaceAscii(' ') == true
doAssert isSpaceAscii('\t') == true
Исходный код Изменить
proc isLowerAscii(c: char): bool {...}{.noSideEffect, gcsafe,
                                   extern: "nsuIsLowerAsciiChar", raises: [],
                                   tags: [].}

Проверяет, является ли c символом строчных букв.

Проверяет только ASCII символы. Используйте модуль Unicode для поддержки UTF-8.

См. также:

  • процедуру toLowerAscii

Пример:

doAssert isLowerAscii('e') == true
doAssert isLowerAscii('E') == false
doAssert isLowerAscii('7') == false
Исходный код Изменить
proc isUpperAscii(c: char): bool {...}{.noSideEffect, gcsafe,
                                   extern: "nsuIsUpperAsciiChar", raises: [],
                                   tags: [].}

Проверяет, является ли c символом заглавных букв.

Проверяет только ASCII символы. Используйте модуль Unicode для поддержки UTF-8.

См. также:

  • процедуру toUpperAscii

Пример:

doAssert isUpperAscii('e') == false
doAssert isUpperAscii('E') == true
doAssert isUpperAscii('7') == false
Исходный код Изменить
proc toLowerAscii(c: char): char {...}{.noSideEffect, gcsafe,
                                   extern: "nsuToLowerAsciiChar", raises: [],
                                   tags: [].}

Возвращает строчную версию символа c.

Работает только для букв A-Z. См. unicode.toLower для версии, работающей с любым символом Юникода.

См. также:

  • процедуру isLowerAscii
  • процедуру toLowerAscii для преобразования строки

Пример:

doAssert toLowerAscii('A') == 'a'
doAssert toLowerAscii('e') == 'e'
Исходный код Изменить
proc toLowerAscii(s: string): string {...}{.noSideEffect, gcsafe,
                                       extern: "nsuToLowerAsciiStr", raises: [],
                                       tags: [].}

Преобразует строку s в строчные буквы.

Работает только для букв A-Z. См. unicode.toLower для версии, работающей с любым символом Юникода.

См. также:

  • процедуру normalize

Пример:

doAssert toLowerAscii("FooBar!") == "foobar!"
Исходный код Изменить
proc toUpperAscii(c: char): char {...}{.noSideEffect, gcsafe,
                                   extern: "nsuToUpperAsciiChar", raises: [],
                                   tags: [].}

Преобразует символ c в заглавные буквы.

Работает только для букв A-Z. См. unicode.toUpper для версии, работающей с любым символом Юникода.

См. также:

  • процедуру isLowerAscii
  • процедуру toUpperAscii для преобразования строки
  • процедуру capitalizeAscii

Пример:

doAssert toUpperAscii('a') == 'A'
doAssert toUpperAscii('E') == 'E'
Исходный код Изменить
proc toUpperAscii(s: string): string {...}{.noSideEffect, gcsafe,
                                       extern: "nsuToUpperAsciiStr", raises: [],
                                       tags: [].}

Преобразует строку s в заглавные буквы.

Работает только для букв A-Z. См. unicode.toUpper для версии, работающей с любым символом Юникода.

См. также:

  • процедуру capitalizeAscii

Пример:

doAssert toUpperAscii("FooBar!") == "FOOBAR!"
Исходный код Изменить
proc capitalizeAscii(s: string): string {...}{.noSideEffect, gcsafe,
    extern: "nsuCapitalizeAscii", raises: [], tags: [].}

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

Работает только для букв A-Z. Используйте модуль Unicode для поддержки UTF-8.

См. также:

  • процедуру toUpperAscii

Пример:

doAssert capitalizeAscii("foo") == "Foo"
doAssert capitalizeAscii("-bar") == "-bar"
Исходный код Изменить
proc nimIdentNormalize(s: string): string {...}{.raises: [], tags: [].}

Нормализует строку s как имя идентификатора Nim.

Это означает преобразование в нижний регистр и удаление всех '_' для всех символов, кроме первого.

Пример:

doAssert nimIdentNormalize("Foo_bar") == "Foobar"
Исходный код Изменить
proc normalize(s: string): string {...}{.noSideEffect, gcsafe,
                                    extern: "nsuNormalize", raises: [], tags: [].}

Нормализует строку s.

Это означает преобразование в нижний регистр и удаление всех '_'. Это НЕ должно использоваться для нормализации имён идентификаторов Nim.

См. также:

  • процедуру toLowerAscii

Пример:

doAssert normalize("Foo_bar") == "foobar"
doAssert normalize("Foo Bar") == "foo bar"
Исходный код Изменить
proc cmpIgnoreCase(a, b: string): int {...}{.noSideEffect, gcsafe,
                                        extern: "nsuCmpIgnoreCase", raises: [],
                                        tags: [].}
Сравнивает две строки без учета регистра. Возвращает:

0 если a == b
< 0 если a < b
> 0 если a > b

Пример:

doAssert cmpIgnoreCase("FooBar", "foobar") == 0
doAssert cmpIgnoreCase("bar", "Foo") < 0
doAssert cmpIgnoreCase("Foo5", "foo4") > 0
Исходный код Изменить
proc cmpIgnoreStyle(a, b: string): int {...}{.noSideEffect, gcsafe,
    extern: "nsuCmpIgnoreStyle", raises: [], tags: [].}

Семантически идентично cmp(normalize(a), normalize(b)). Просто оптимизировано для того, чтобы не выделять временные строки. НЕ должно использоваться для сравнения имён идентификаторов Nim. Используйте macros.eqIdent для этого.

Возвращает:

0 если a == b
< 0 если a < b
> 0 если a > b

Пример:

doAssert cmpIgnoreStyle("foo_bar", "FooBar") == 0
doAssert cmpIgnoreStyle("foo_bar_5", "FooBar4") > 0
Исходный код Изменить
proc split(s: string; sep: char; maxsplit: int = -1): seq[string] {...}{.
    noSideEffect, gcsafe, extern: "nsuSplitChar", raises: [], tags: [].}

То же самое, что и итератор split (см. его документацию), но является процедурой, возвращающей последовательность подстрок.

См. также:

  • итератор split
  • процедура rsplit
  • процедура splitLines
  • процедура splitWhitespace

Пример:

doAssert "a,b,c".split(',') == @["a", "b", "c"]
doAssert "".split(' ') == @[""]
Исходный код Изменить
proc split(s: string; seps: set[char] = Whitespace; maxsplit: int = -1): seq[
    string] {...}{.noSideEffect, gcsafe, extern: "nsuSplitCharSet", raises: [],
              tags: [].}

То же самое, что и итератор split (см. его документацию), но является процедурой, возвращающей последовательность подстрок.

См. также:

  • итератор split
  • процедура rsplit
  • процедура splitLines
  • процедура splitWhitespace

Пример:

doAssert "a,b;c".split({',', ';'}) == @["a", "b", "c"]
doAssert "".split({' '}) == @[""]
Исходный код Изменить
proc split(s: string; sep: string; maxsplit: int = -1): seq[string] {...}{.
    noSideEffect, gcsafe, extern: "nsuSplitString", raises: [], tags: [].}

Разделяет строку s на подстроки с использованием разделителя-строки.

Подстроки разделяются строкой sep. Это обёртка вокруг итератора split.

См. также:

  • итератор split
  • процедура rsplit
  • процедура splitLines
  • процедура splitWhitespace

Пример:

doAssert "a,b,c".split(",") == @["a", "b", "c"]
doAssert "a man a plan a canal panama".split("a ") == @["", "man ", "plan ", "canal panama"]
doAssert "".split("Elon Musk") == @[""]
doAssert "a  largely    spaced sentence".split(" ") == @["a", "", "largely",
    "", "", "", "spaced", "sentence"]
doAssert "a  largely    spaced sentence".split(" ", maxsplit = 1) == @["a", " largely    spaced sentence"]
Исходный код Изменить
proc rsplit(s: string; sep: char; maxsplit: int = -1): seq[string] {...}{.
    noSideEffect, gcsafe, extern: "nsuRSplitChar", raises: [], tags: [].}

То же самое, что и итератор rsplit, но это процедура, которая возвращает последовательность подстрок.

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

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

var tailSplit = rsplit("Root#Object#Method#Index", '#', maxsplit=1)

В результате в tailSplit будет содержаться:

@["Root#Object#Method", "Index"]

См. также:

  • итератор rsplit
  • процедура split
  • процедура splitLines
  • процедура splitWhitespace
Исходный код Редактировать
proc rsplit(s: string; seps: set[char] = Whitespace; maxsplit: int = -1): seq[
    string] {...}{.noSideEffect, gcsafe, extern: "nsuRSplitCharSet", raises: [],
              tags: [].}

То же самое, что и итератор rsplit, но это процедура, которая возвращает последовательность подстрок.

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

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

var tailSplit = rsplit("Root#Object#Method#Index", {'#'}, maxsplit=1)

В результате в tailSplit будет содержаться:

@["Root#Object#Method", "Index"]

См. также:

  • итератор rsplit
  • процедура split
  • процедура splitLines
  • процедура splitWhitespace
Исходный код Редактировать
proc rsplit(s: string; sep: string; maxsplit: int = -1): seq[string] {...}{.
    noSideEffect, gcsafe, extern: "nsuRSplitString", raises: [], tags: [].}

То же самое, что и итератор rsplit, но это процедура, которая возвращает последовательность подстрок.

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

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

var tailSplit = rsplit("Root#Object#Method#Index", "#", maxsplit=1)

В результате в tailSplit будет содержаться:

@["Root#Object#Method", "Index"]

См. также:

  • итератор rsplit
  • процедура split
  • процедура splitLines
  • процедура splitWhitespace

Пример:

doAssert "a  largely    spaced sentence".rsplit(" ", maxsplit = 1) == @[
    "a  largely    spaced", "sentence"]
doAssert "a,b,c".rsplit(",") == @["a", "b", "c"]
doAssert "a man a plan a canal panama".rsplit("a ") == @["", "man ",
    "plan ", "canal panama"]
doAssert "".rsplit("Elon Musk") == @[""]
doAssert "a  largely    spaced sentence".rsplit(" ") == @["a", "",
    "largely", "", "", "", "spaced", "sentence"]
Исходный код Редактировать
proc splitLines(s: string; keepEol = false): seq[string] {...}{.noSideEffect, gcsafe,
    extern: "nsuSplitLines", raises: [], tags: [].}

То же самое, что и итератор splitLines (см. его документацию), но это процедура, которая возвращает последовательность подстрок.

См. также:

  • итератор splitLines
  • процедура splitWhitespace
  • процедура countLines
Исходный код Редактировать
proc splitWhitespace(s: string; maxsplit: int = -1): seq[string] {...}{.noSideEffect,
    gcsafe, extern: "nsuSplitWhitespace", raises: [], tags: [].}

То же самое, что и итератор splitWhitespace (см. его документацию), но это процедура, которая возвращает последовательность подстрок.

См. также:

  • итератор splitWhitespace
  • процедура splitLines
Исходный код Редактировать
proc toBin(x: BiggestInt; len: Positive): string {...}{.noSideEffect, gcsafe,
    extern: "nsuToBin", raises: [], tags: [].}

Преобразует x в его двоичное представление.

Полученная строка всегда имеет длину len символов. Не генерируется префикс 0b.

Пример:

let
  a = 29
  b = 257
doAssert a.toBin(8) == "00011101"
doAssert b.toBin(8) == "00000001"
doAssert b.toBin(9) == "100000001"
Исходный код Редактировать
proc toOct(x: BiggestInt; len: Positive): string {...}{.noSideEffect, gcsafe,
    extern: "nsuToOct", raises: [], tags: [].}

Преобразует x в его восьмеричное представление.

Полученная строка всегда имеет длину len символов. Не генерируется префикс 0o.

Не путайте с процедурой toOct.

Пример:

let
  a = 62
  b = 513
doAssert a.toOct(3) == "076"
doAssert b.toOct(3) == "001"
doAssert b.toOct(5) == "01001"
Исходный код Редактировать
proc toHex[T: SomeInteger](x: T; len: Positive): string {...}{.noSideEffect.}

Преобразует x в его шестнадцатеричное представление.

Полученная строка будет иметь ровно len символов. Не генерируется префикс, например 0x. x рассматривается как беззнаковое значение.

Пример:

let
  a = 62'u64
  b = 4097'u64
doAssert a.toHex(3) == "03E"
doAssert b.toHex(3) == "001"
doAssert b.toHex(4) == "1001"
doAssert toHex(62, 3) == "03E"
doAssert toHex(-8, 6) == "FFFFF8"
Исходный код Редактировать
proc toHex[T: SomeInteger](x: T): string {...}{.noSideEffect.}
Сокращение для toHex(x, T.sizeof * 2)

Пример:

doAssert toHex(1984'i64) == "00000000000007C0"
doAssert toHex(1984'i16) == "07C0"
Исходный код Редактировать
proc toHex(s: string): string {...}{.noSideEffect, gcsafe, raises: [], tags: [].}

Преобразует строку байтов в её шестнадцатеричное представление.

Выходная строка имеет вдвое большую длину, чем входная. Не генерируется префикс, например 0x.

См. также:

  • процедуру parseHexStr для обратной операции

Пример:

let
  a = "1"
  b = "A"
  c = "\0\255"
doAssert a.toHex() == "31"
doAssert b.toHex() == "41"
doAssert c.toHex() == "00FF"
Исходный код Редактировать
proc toOctal(c: char): string {...}{.noSideEffect, gcsafe, extern: "nsuToOctal",
                                raises: [], tags: [].}

Преобразует символ c в его восьмеричное представление.

Полученная строка может не иметь ведущего нуля. Её длина всегда равна ровно 3.

Не путайте с процедурой toOct.

Пример:

doAssert toOctal('1') == "061"
doAssert toOctal('A') == "101"
doAssert toOctal('a') == "141"
doAssert toOctal('!') == "041"
Исходный код Редактировать
proc fromBin[T: SomeInteger](s: string): T

Парсит двоичное целое значение из строки s.

Если s не является допустимым двоичным целым числом, возбуждается ValueError. s может иметь один из следующих необязательных префиксов: 0b, 0B. Подчеркивания в s игнорируются.

Не проверяет переполнение. Если значение, представленное s, слишком велико для типа возвращаемого значения, возвращается только значение самых правых двоичных цифр s без выдачи ошибки.

Пример:

let s = "0b_0100_1000_1000_1000_1110_1110_1001_1001"
doAssert fromBin[int](s) == 1216933529
doAssert fromBin[int8](s) == 0b1001_1001'i8
doAssert fromBin[int8](s) == -103'i8
doAssert fromBin[uint8](s) == 153
doAssert s.fromBin[:int16] == 0b1110_1110_1001_1001'i16
doAssert s.fromBin[:uint64] == 1216933529'u64
Исходный код Редактировать
proc fromOct[T: SomeInteger](s: string): T

Парсит восьмеричное целое значение из строки s.

Если s не является допустимым восьмеричным целым числом, возбуждается ValueError. s может иметь один из следующих необязательных префиксов: 0o, 0O. Подчеркивания в s игнорируются.

Не проверяет переполнение. Если значение, представленное s, слишком велико для типа возвращаемого значения, возвращается только значение самых правых восьмеричных цифр s без выдачи ошибки.

Пример:

let s = "0o_123_456_777"
doAssert fromOct[int](s) == 21913087
doAssert fromOct[int8](s) == 0o377'i8
doAssert fromOct[int8](s) == -1'i8
doAssert fromOct[uint8](s) == 255'u8
doAssert s.fromOct[:int16] == 24063'i16
doAssert s.fromOct[:uint64] == 21913087'u64
Исходный код Редактировать
proc fromHex[T: SomeInteger](s: string): T

Парсит шестнадцатеричное целое значение из строки s.

Если s не является допустимым шестнадцатеричным целым числом, возбуждается ValueError. s может иметь один из следующих необязательных префиксов: 0x, 0X, #. Подчеркивания в s игнорируются.

Не проверяет переполнение. Если значение, представленное s, слишком велико для типа возвращаемого значения, возвращается только значение самых правых шестнадцатеричных цифр s без выдачи ошибки.

Пример:

let s = "0x_1235_8df6"
doAssert fromHex[int](s) == 305499638
doAssert fromHex[int8](s) == 0xf6'i8
doAssert fromHex[int8](s) == -10'i8
doAssert fromHex[uint8](s) == 246'u8
doAssert s.fromHex[:int16] == -29194'i16
doAssert s.fromHex[:uint64] == 305499638'u64
Исходный код Редактировать
proc intToStr(x: int; minchars: Positive = 1): string {...}{.noSideEffect, gcsafe,
    extern: "nsuIntToStr", raises: [], tags: [].}

Преобразует x в его десятичное представление.

Полученная строка будет иметь минимальную длину minchars символов. Это достигается путём добавления ведущих нулей.

Пример:

doAssert intToStr(1984) == "1984"
doAssert intToStr(1984, 6) == "001984"
Исходный код Редактировать
proc parseInt(s: string): int {...}{.noSideEffect, gcsafe, extern: "nsuParseInt",
                                raises: [ValueError], tags: [].}

Парсит целое десятичное значение, содержащееся в s.

Если s не является допустимым целым числом, генерируется ValueError.

Пример:

doAssert parseInt("-0042") == -42
Исходный код Редактировать
proc parseBiggestInt(s: string): BiggestInt {...}{.noSideEffect, gcsafe,
    extern: "nsuParseBiggestInt", raises: [ValueError], tags: [].}

Парсит целое десятичное значение, содержащееся в s.

Если s не является допустимым целым числом, генерируется ValueError.

Исходный код Редактировать
proc parseUInt(s: string): uint {...}{.noSideEffect, gcsafe, extern: "nsuParseUInt",
                                  raises: [ValueError], tags: [].}

Парсит целое десятичное беззнаковое значение, содержащееся в s.

Если s не является допустимым целым числом, генерируется ValueError.

Исходный код Редактировать
proc parseBiggestUInt(s: string): BiggestUInt {...}{.noSideEffect, gcsafe,
    extern: "nsuParseBiggestUInt", raises: [ValueError], tags: [].}

Парсит целое десятичное беззнаковое значение, содержащееся в s.

Если s не является допустимым целым числом, генерируется ValueError.

Исходный код Редактировать
proc parseFloat(s: string): float {...}{.noSideEffect, gcsafe,
                                    extern: "nsuParseFloat",
                                    raises: [ValueError], tags: [].}

Парсит значение с плавающей запятой в десятичном формате, содержащееся в s.

Если s не является допустимым числом с плавающей запятой, генерируется ValueError . Также поддерживаются NAN, INF, -INF (регистронезависимое сравнение).

Пример:

doAssert parseFloat("3.14") == 3.14
doAssert parseFloat("inf") == 1.0/0
Исходный код Редактировать
proc parseBinInt(s: string): int {...}{.noSideEffect, gcsafe,
                                   extern: "nsuParseBinInt",
                                   raises: [ValueError], tags: [].}

Парсит двоичное целое значение, содержащееся в s.

Если s не является допустимым двоичным целым числом, генерируется ValueError . s может иметь один из следующих необязательных префиксов: 0b, 0B . Подчеркивания в s игнорируются.

Пример:

let
  a = "0b11_0101"
  b = "111"
doAssert a.parseBinInt() == 53
doAssert b.parseBinInt() == 7
Исходный код Редактировать
proc parseOctInt(s: string): int {...}{.noSideEffect, gcsafe,
                                   extern: "nsuParseOctInt",
                                   raises: [ValueError], tags: [].}

Парсит восьмеричное целое значение, содержащееся в s.

Если s не является допустимым восьмеричным целым числом, генерируется ValueError . s может иметь один из следующих необязательных префиксов: 0o, 0O . Подчеркивания в s игнорируются.

Исходный код Редактировать
proc parseHexInt(s: string): int {...}{.noSideEffect, gcsafe,
                                   extern: "nsuParseHexInt",
                                   raises: [ValueError], tags: [].}

Парсит шестнадцатеричное целое значение, содержащееся в s.

Если s не является допустимым шестнадцатеричным целым числом, генерируется ValueError . s может иметь один из следующих необязательных префиксов: 0x, 0X, # . Подчеркивания в s игнорируются.

Исходный код Редактировать
proc parseHexStr(s: string): string {...}{.noSideEffect, gcsafe,
                                      extern: "nsuParseHexStr",
                                      raises: [ValueError], tags: [].}

Преобразует шестнадцатеричную строку в строку байтов, например:

Вызывает ValueError для недопустимых шестнадцатеричных значений. Сравнение регистронезависимое.

См. также:

  • toHex proc для обратной операции

Пример:

let
  a = "41"
  b = "3161"
  c = "00ff"
doAssert parseHexStr(a) == "A"
doAssert parseHexStr(b) == "1a"
doAssert parseHexStr(c) == "\0\255"
Исходный код Редактировать
proc parseBool(s: string): bool {...}{.raises: [ValueError], tags: [].}

Парсит значение в bool.

Если s равно одному из следующих значений: y, yes, true, 1, on, возвращает true. Если s равно одному из следующих значений: n, no, false, 0, off, возвращает false. В противном случае генерируется исключение ValueError.

Пример:

let a = "n"
doAssert parseBool(a) == false
Исходный код Редактировать
proc parseEnum[T: enum](s: string): T

Парсит перечисление T . Возникает ошибка во время компиляции, если данный тип перечисления содержит несколько полей с одинаковым строковым значением.

Генерирует ValueError для недопустимого значения в s . Сравнение выполняется регистронезависимым способом.

Пример:

type
  MyEnum = enum
    first = "1st",
    second,
    third = "3rd"

doAssert parseEnum[MyEnum]("1_st") == first
doAssert parseEnum[MyEnum]("second") == second
doAssertRaises(ValueError):
  echo parseEnum[MyEnum]("third")
Исходный код Редактировать
proc parseEnum[T: enum](s: string; default: T): T

Парсит перечисление T . Возникает ошибка во время компиляции, если данный тип перечисления содержит несколько полей с одинаковым строковым значением.

Использует default для недопустимого значения в s . Сравнение выполняется регистронезависимым способом.

Пример:

type
  MyEnum = enum
    first = "1st",
    second,
    third = "3rd"

doAssert parseEnum[MyEnum]("1_st") == first
doAssert parseEnum[MyEnum]("second") == second
doAssert parseEnum[MyEnum]("last", third) == third
Исходный код Редактировать
proc repeat(c: char; count: Natural): string {...}{.noSideEffect, gcsafe,
    extern: "nsuRepeatChar", raises: [], tags: [].}
Возвращает строку длиной count, состоящую только из символа c.

Пример:

let a = 'z'
doAssert a.repeat(5) == "zzzzz"
Исходный код Редактировать
proc repeat(s: string; n: Natural): string {...}{.noSideEffect, gcsafe,
    extern: "nsuRepeatStr", raises: [], tags: [].}
Возвращает строку s , конкатенированную n раз.

Пример:

doAssert "+ foo +".repeat(3) == "+ foo ++ foo ++ foo +"
Исходный код Редактировать
proc spaces(n: Natural): string {...}{.inline, raises: [], tags: [].}

Возвращает строку с n пробелами. Эта процедура может быть использована для выравнивания строк по левому краю.

См. также:

  • align proc
  • alignLeft proc
  • indent proc
  • center proc

Пример:

let
  width = 15
  text1 = "Hello user!"
  text2 = "This is a very long string"
doAssert text1 & spaces(max(0, width - text1.len)) & "|" ==
         "Hello user!    |"
doAssert text2 & spaces(max(0, width - text2.len)) & "|" ==
         "This is a very long string|"
Исходный код Редактировать
proc align(s: string; count: Natural; padding = ' '): string {...}{.noSideEffect,
    gcsafe, extern: "nsuAlignString", raises: [], tags: [].}

Выравнивает строку s по правому краю с padding, так чтобы ее длина была count.

Перед s добавляются символы (по умолчанию пробелы), что приводит к правому выравниванию. Если s.len >= count, пробелы не добавляются, и s возвращается без изменений. Для левого выравнивания используйте alignLeft proc.

См. также:

  • alignLeft proc
  • spaces proc
  • indent proc
  • center proc

Пример:

assert align("abc", 4) == " abc"
assert align("a", 0) == "a"
assert align("1232", 6) == "  1232"
assert align("1232", 6, '#') == "##1232"
Исходный код Редактировать
proc alignLeft(s: string; count: Natural; padding = ' '): string {...}{.noSideEffect,
    raises: [], tags: [].}

Выравнивает строку s по левому краю с padding, так чтобы ее длина была count.

После s добавляются символы (по умолчанию пробелы), что приводит к левому выравниванию. Если s.len >= count, пробелы не добавляются, и s возвращается без изменений. Для правого выравнивания используйте align proc.

См. также:

  • align proc
  • spaces proc
  • indent proc
  • center proc

Пример:

assert alignLeft("abc", 4) == "abc "
assert alignLeft("a", 0) == "a"
assert alignLeft("1232", 6) == "1232  "
assert alignLeft("1232", 6, '#') == "1232##"
Исходный код Редактировать
proc center(s: string; width: int; fillChar: char = ' '): string {...}{.noSideEffect,
    gcsafe, extern: "nsuCenterString", raises: [], tags: [].}

Возвращает содержимое s центрированным в строке width длиной, используя fillChar (по умолчанию: пробел) в качестве отступа.

Исходная строка возвращается, если width меньше или равно s.len.

См. также:

  • процедуру align
  • процедуру alignLeft
  • процедуру spaces
  • процедуру indent

Пример:

let a = "foo"
doAssert a.center(2) == "foo"
doAssert a.center(5) == " foo "
doAssert a.center(6) == " foo  "
Исходный код Редактировать
proc indent(s: string; count: Natural; padding: string = " "): string {...}{.
    noSideEffect, gcsafe, extern: "nsuIndent", raises: [], tags: [].}

Отступает каждую строку в s на величину count количество padding.

Примечание: Это не сохраняет символы новой строки, используемые в s.

См. также:

  • процедуру align
  • процедуру alignLeft
  • процедуру spaces
  • процедуру unindent
  • процедуру dedent

Пример:

doAssert indent("First line\c\l and second line.", 2) ==
         "  First line\l   and second line."
Исходный код Редактировать
proc unindent(s: string; count: Natural = int.high; padding: string = " "): string {...}{.
    noSideEffect, gcsafe, extern: "nsuUnindent", raises: [], tags: [].}

Убирает отступы каждой строки в s на величину count количество padding.

Примечание: Это не сохраняет символы новой строки, используемые в s.

См. также:

  • процедуру dedent
  • процедуру align
  • процедуру alignLeft
  • процедуру spaces
  • процедуру indent

Пример:

let x = """
      Hello
        There
    """.unindent()

doAssert x == "Hello\nThere\n"
Исходный код Редактировать
proc indentation(s: string): Natural {...}{.raises: [], tags: [].}
Возвращает количество общего отступа всех строк в s, игнорируя строки, состоящие только из пробелов. Исходный код Редактировать
proc dedent(s: string; count: Natural = indentation(s)): string {...}{.noSideEffect,
    gcsafe, extern: "nsuDedent", raises: [], tags: [].}

Убирает отступы каждой строки в s на величину count количество padding . Единственное отличие от процедуры unindent заключается в том, что по умолчанию она обрезает только количество отступа, общее для всех строк в s, в отличие от всего отступа. Она поддерживает только пробелы в качестве отступа.

Примечание: Это не сохраняет символы новой строки, используемые в s.

См. также:

  • процедуру unindent
  • процедуру align
  • процедуру alignLeft
  • процедуру spaces
  • процедуру indent

Пример:

let x = """
      Hello
        There
    """.dedent()

doAssert x == "Hello\n  There\n"
Исходный код Редактировать
proc delete(s: var string; first, last: int) {...}{.noSideEffect, gcsafe,
    extern: "nsuDelete", raises: [], tags: [].}

Удаляет в s (должен быть объявлен как var) символы по позициям first ..last (включая оба конца).

Это изменяет s само по себе, оно не возвращает копию.

Пример:

var a = "abracadabra"

a.delete(4, 5)
doAssert a == "abradabra"

a.delete(1, 6)
doAssert a == "ara"

a.delete(2, 999)
doAssert a == "ar"
Исходный код Редактировать
proc startsWith(s: string; prefix: char): bool {...}{.noSideEffect, inline,
    raises: [], tags: [].}

Возвращает true, если s начинается с символа prefix.

См. также:

  • процедуру endsWith
  • процедуру continuesWith
  • процедуру removePrefix

Пример:

let a = "abracadabra"
doAssert a.startsWith('a') == true
doAssert a.startsWith('b') == false
Исходный код Редактировать
proc startsWith(s, prefix: string): bool {...}{.noSideEffect, gcsafe,
    extern: "nsuStartsWith", raises: [], tags: [].}

Возвращает true, если s начинается со строки prefix.

Если prefix == "" true возвращается.

См. также:

  • процедуру endsWith
  • процедуру continuesWith
  • процедуру removePrefix

Пример:

let a = "abracadabra"
doAssert a.startsWith("abra") == true
doAssert a.startsWith("bra") == false
Исходный код Редактировать
proc endsWith(s: string; suffix: char): bool {...}{.noSideEffect, inline, raises: [],
    tags: [].}

Возвращает true, если s заканчивается на suffix.

См. также:

  • процедуру startsWith
  • процедуру continuesWith
  • процедуру removeSuffix

Пример:

let a = "abracadabra"
doAssert a.endsWith('a') == true
doAssert a.endsWith('b') == false
Исходный код Редактировать
proc endsWith(s, suffix: string): bool {...}{.noSideEffect, gcsafe,
    extern: "nsuEndsWith", raises: [], tags: [].}

Возвращает true, если s заканчивается на suffix.

Если suffix == "" true возвращается.

См. также:

  • процедуру startsWith
  • процедуру continuesWith
  • процедуру removeSuffix

Пример:

let a = "abracadabra"
doAssert a.endsWith("abra") == true
doAssert a.endsWith("dab") == false
Исходный код Редактировать
proc continuesWith(s, substr: string; start: Natural): bool {...}{.noSideEffect,
    gcsafe, extern: "nsuContinuesWith", raises: [], tags: [].}

Возвращает true, если s продолжает с substr в позиции start.

Если substr == "" true возвращается.

См. также:

  • процедуру startsWith
  • процедуру endsWith

Пример:

let a = "abracadabra"
doAssert a.continuesWith("ca", 4) == true
doAssert a.continuesWith("ca", 5) == false
doAssert a.continuesWith("dab", 6) == true
Исходный код Редактировать
proc removePrefix(s: var string; chars: set[char] = Newlines) {...}{.gcsafe,
    extern: "nsuRemovePrefixCharSet", raises: [], tags: [].}

Удаляет все символы из chars с начала строки s (вместо копии).

См. также:

  • процедуру removeSuffix

Пример:

var userInput = "\r\n*~Hello World!"
userInput.removePrefix
doAssert userInput == "*~Hello World!"
userInput.removePrefix({'~', '*'})
doAssert userInput == "Hello World!"

var otherInput = "?!?Hello!?!"
otherInput.removePrefix({'!', '?'})
doAssert otherInput == "Hello!?!"
Исходный код Редактировать
proc removePrefix(s: var string; c: char) {...}{.gcsafe,
    extern: "nsuRemovePrefixChar", raises: [], tags: [].}

Удаляет все вхождения одного символа (вместо копии) с начала строки.

См. также:

  • процедуру removeSuffix
  • процедуру startsWith

Пример:

var ident = "pControl"
ident.removePrefix('p')
doAssert ident == "Control"
Исходный код Редактировать
proc removePrefix(s: var string; prefix: string) {...}{.gcsafe,
    extern: "nsuRemovePrefixString", raises: [], tags: [].}

Удаляет первое совпадающее префиксное значение (вместо копии) из строки.

См. также:

  • процедуру removeSuffix
  • процедуру startsWith

Пример:

var answers = "yesyes"
answers.removePrefix("yes")
doAssert answers == "yes"
Исходный код Редактировать
proc removeSuffix(s: var string; chars: set[char] = Newlines) {...}{.gcsafe,
    extern: "nsuRemoveSuffixCharSet", raises: [], tags: [].}

Удаляет все символы из chars с конца строки s (вместо копии).

См. также:

  • процедуру removePrefix

Пример:

var userInput = "Hello World!*~\r\n"
userInput.removeSuffix
doAssert userInput == "Hello World!*~"
userInput.removeSuffix({'~', '*'})
doAssert userInput == "Hello World!"

var otherInput = "Hello!?!"
otherInput.removeSuffix({'!', '?'})
doAssert otherInput == "Hello"
Исходный код Редактировать
proc removeSuffix(s: var string; c: char) {...}{.gcsafe,
    extern: "nsuRemoveSuffixChar", raises: [], tags: [].}

Удаляет все вхождения одного символа (вместо копии) с конца строки.

См. также:

  • процедуру removePrefix
  • процедуру endsWith

Пример:

var table = "users"
table.removeSuffix('s')
doAssert table == "user"

var dots = "Trailing dots......."
dots.removeSuffix('.')
doAssert dots == "Trailing dots"
Исходный код Редактировать
proc removeSuffix(s: var string; suffix: string) {...}{.gcsafe,
    extern: "nsuRemoveSuffixString", raises: [], tags: [].}

Удалить первый соответствующий суффикс (внутри строки) из строки.

См. также:

  • процедура removePrefix
  • процедура endsWith

Пример:

var answers = "yeses"
answers.removeSuffix("es")
doAssert answers == "yes"
Исходный код Редактировать
proc addSep(dest: var string; sep = ", "; startLen: Natural = 0) {...}{.noSideEffect,
    inline, raises: [], tags: [].}

Добавляет разделитель к dest только если его длина больше startLen.

Это сокращённая запись для:

if dest.len > startLen: add(dest, sep)

Это часто полезно для генерации кода, где элементы должны быть разделены через sep. sep добавляется только если dest длиннее startLen. Следующий пример создаёт строку, описывающую массив целых чисел.

Пример:

var arr = "["
for x in items([2, 3, 5, 7, 11]):
  addSep(arr, startLen = len("["))
  add(arr, $x)
add(arr, "]")
doAssert arr == "[2, 3, 5, 7, 11]"
Исходный код Редактировать
proc allCharsInSet(s: string; theSet: set[char]): bool {...}{.raises: [], tags: [].}
Возвращает true, если каждый символ s находится в наборе theSet.

Пример:

doAssert allCharsInSet("aeea", {'a', 'e'}) == true
doAssert allCharsInSet("", {'a', 'e'}) == true
Исходный код Редактировать
proc abbrev(s: string; possibilities: openArray[string]): int {...}{.raises: [],
    tags: [].}

Возвращает индекс первого элемента в possibilities, начинающегося с s, если он однозначен.

Возвращает -1, если элемент не найден, и -2, если найдено несколько соответствующих элементов.

Пример:

doAssert abbrev("fac", ["college", "faculty", "industry"]) == 1
doAssert abbrev("foo", ["college", "faculty", "industry"]) == -1 # Not found
doAssert abbrev("fac", ["college", "faculty", "faculties"]) == -2 # Ambiguous
doAssert abbrev("college", ["college", "colleges", "industry"]) == 0
Исходный код Редактировать
proc join(a: openArray[string]; sep: string = ""): string {...}{.noSideEffect,
    gcsafe, extern: "nsuJoinSep", raises: [], tags: [].}
Объединяет все строки в контейнере a, разделяя их с помощью sep.

Пример:

doAssert join(["A", "B", "Conclusion"], " -> ") == "A -> B -> Conclusion"
Исходный код Редактировать
proc join[T: not string](a: openArray[T]; sep: string = ""): string {...}{.
    noSideEffect, gcsafe.}
Преобразует все элементы в контейнере a в строки с помощью $ и объединяет их с sep.

Пример:

doAssert join([1, 2, 3], " -> ") == "1 -> 2 -> 3"
Исходный код Редактировать
proc initSkipTable(a: var SkipTable; sub: string) {...}{.noSideEffect, gcsafe,
    extern: "nsuInitSkipTable", raises: [], tags: [].}
Предварительно обрабатывает таблицу a для sub. Исходный код Редактировать
proc find(a: SkipTable; s, sub: string; start: Natural = 0; last = 0): int {...}{.
    noSideEffect, gcsafe, extern: "nsuFindStrA", raises: [], tags: [].}

Ищет sub в s в пределах диапазона start..last с использованием предварительно обработанной таблицы a. Если last не указано, оно по умолчанию равно s.high (последний элемент).

Поиск регистрозависимый. Если sub не найдено в s, возвращается -1.

Исходный код Редактировать
proc find(s: string; sub: char; start: Natural = 0; last = 0): int {...}{.
    noSideEffect, gcsafe, extern: "nsuFindChar", raises: [], tags: [].}

Ищет sub в s в пределах диапазона start..last (включая оба конца). Если last не указано, оно по умолчанию равно s.high (последний элемент).

Поиск регистрозависимый. Если sub не найдено в s, возвращается -1. В противном случае возвращаемый индекс относится к s[0], а не к start. Используйте s[start..last].rfind для индекса, отсчитываемого от start.

См. также:

  • процедура rfind
  • процедура replace
Исходный код Редактировать
proc find(s: string; chars: set[char]; start: Natural = 0; last = 0): int {...}{.
    noSideEffect, gcsafe, extern: "nsuFindCharSet", raises: [], tags: [].}

Ищет chars в s в пределах диапазона start..last (включая оба конца). Если last не указано, оно по умолчанию равно s.high (последний элемент).

Если s не содержит ни одного символа из chars, возвращается -1. В противном случае возвращаемый индекс относится к s[0], а не к start. Используйте s[start..last].find для индекса, отсчитываемого от start.

См. также:

  • процедура rfind
  • процедура multiReplace
Исходный код Редактировать
proc find(s, sub: string; start: Natural = 0; last = 0): int {...}{.noSideEffect,
    gcsafe, extern: "nsuFindStr", raises: [], tags: [].}

Ищет sub в s в пределах диапазона start..last (включая оба конца). Если last не указано, оно по умолчанию равно s.high (последний элемент).

Поиск регистрозависимый. Если sub не найдено в s, возвращается -1. В противном случае возвращаемый индекс относится к s[0], а не к start. Используйте s[start..last].find для индекса, отсчитываемого от start.

См. также:

  • процедура rfind
  • процедура replace
Исходный код Редактировать
proc rfind(s: string; sub: char; start: Natural = 0; last = -1): int {...}{.
    noSideEffect, gcsafe, extern: "nsuRFindChar", raises: [], tags: [].}

Ищет sub в s в пределах диапазона start..last (включая оба конца) в обратном порядке — начиная с высоких индексов и двигаясь вниз к первому символу или start. Если last не указано, оно по умолчанию равно s.high (последний элемент).

Поиск регистрозависимый. Если sub не найдено в s, возвращается -1. В противном случае возвращаемый индекс относится к s[0], а не к start. Используйте s[start..last].find для индекса, отсчитываемого от start.

См. также:

  • процедура find
Исходный код Редактировать
proc rfind(s: string; chars: set[char]; start: Natural = 0; last = -1): int {...}{.
    noSideEffect, gcsafe, extern: "nsuRFindCharSet", raises: [], tags: [].}

Ищет chars в s в пределах диапазона start..last (включая оба конца) в обратном порядке — начиная с высоких индексов и двигаясь вниз к первому символу или start. Если last не указано, оно по умолчанию равно s.high (последний элемент).

Если s не содержит ни одного символа из chars, возвращается -1. В противном случае возвращаемый индекс относится к s[0], а не к start. Используйте s[start..last].rfind для индекса, отсчитываемого от start.

См. также:

  • процедура find
Исходный код Редактировать
proc rfind(s, sub: string; start: Natural = 0; last = -1): int {...}{.noSideEffect,
    gcsafe, extern: "nsuRFindStr", raises: [], tags: [].}

Ищет sub в s в пределах диапазона start..last (включая оба конца) в обратном порядке — начиная с высоких индексов и двигаясь вниз к первому символу или start. Если last не указано, оно по умолчанию равно s.high (последний элемент).

Поиск регистрозависимый. Если sub не найдено в s, возвращается -1. В противном случае возвращаемый индекс относится к s[0], а не к start. Используйте s[start..last].rfind для индекса, отсчитываемого от start.

См. также:

  • процедура find
Исходный код Редактировать
proc count(s: string; sub: char): int {...}{.noSideEffect, gcsafe,
                                        extern: "nsuCountChar", raises: [],
                                        tags: [].}

Подсчитать количество вхождений символа sub в строке s.

См. также:

  • процедура countLines
Исходный код Редактировать
proc count(s: string; subs: set[char]): int {...}{.noSideEffect, gcsafe,
    extern: "nsuCountCharSet", raises: [], tags: [].}

Подсчитать количество вхождений группы символов subs в строке s.

См. также:

  • процедура countLines
Исходный код Редактировать
proc count(s: string; sub: string; overlapping: bool = false): int {...}{.
    noSideEffect, gcsafe, extern: "nsuCountString", raises: [], tags: [].}

Подсчитайте количество вхождений подстроки sub в строке s. Перекрывающиеся вхождения sub учитываются только тогда, когда overlapping установлено в значение true (по умолчанию: false).

См. также:

  • процедура countLines
Исходный код Редактировать
proc countLines(s: string): int {...}{.noSideEffect, gcsafe, extern: "nsuCountLines",
                                  raises: [], tags: [].}

Возвращает количество строк в строке s.

Это то же самое, что и len(splitLines(s)), но значительно эффективнее, потому что не изменяет строку, не создавая временных объектов. Поддерживаются все комбинации символов новой строки (CR, LF, CR-LF).

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

См. также:

  • процедура splitLines

Пример:

doAssert countLines("First line\l and second line.") == 2
Исходный код Редактировать
proc contains(s, sub: string): bool {...}{.noSideEffect, raises: [], tags: [].}

То же самое, что и find(s, sub) >= 0.

См. также:

  • процедура find
Исходный код Редактировать
proc contains(s: string; chars: set[char]): bool {...}{.noSideEffect, raises: [],
    tags: [].}

То же самое, что и find(s, chars) >= 0.

См. также:

  • процедура find
Исходный код Редактировать
proc replace(s, sub: string; by = ""): string {...}{.noSideEffect, gcsafe,
    extern: "nsuReplaceStr", raises: [], tags: [].}

Заменяет sub в s строкой by.

См. также:

  • процедура find
  • процедура replace для замены отдельных символов
  • процедура replaceWord
  • процедура multiReplace
Исходный код Редактировать
proc replace(s: string; sub, by: char): string {...}{.noSideEffect, gcsafe,
    extern: "nsuReplaceChar", raises: [], tags: [].}

Заменяет sub в s символом by.

Оптимизированная версия replace для символов.

См. также:

  • процедура find
  • процедура replaceWord
  • процедура multiReplace
Исходный код Редактировать
proc replaceWord(s, sub: string; by = ""): string {...}{.noSideEffect, gcsafe,
    extern: "nsuReplaceWord", raises: [], tags: [].}

Заменяет sub в s строкой by.

Каждое вхождение sub должно быть окружено границами слова (сравнимо с \b в регулярных выражениях), в противном случае оно не будет заменено.

Исходный код Редактировать
proc multiReplace(s: string; replacements: varargs[(string, string)]): string {...}{.
    noSideEffect, raises: [], tags: [].}

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

multiReplace выполняет все замены за один проход, что означает, что он может использоваться, например, для обмена вхождениями «a» и «b».

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

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

Исходный код Редактировать
proc insertSep(s: string; sep = '_'; digits = 3): string {...}{.noSideEffect, gcsafe,
    extern: "nsuInsertSep", raises: [], tags: [].}

Вставляет разделитель sep после digits символов (по умолчанию: 3) справа налево.

Несмотря на то, что алгоритм работает с любой строкой s, он полезен только если s содержит число.

Пример:

doAssert insertSep("1000000") == "1_000_000"
Исходный код Редактировать
proc escape(s: string; prefix = "\""; suffix = "\""): string {...}{.noSideEffect,
    gcsafe, extern: "nsuEscape", raises: [], tags: [].}

Экранирует строку s. См. system.addEscapedChar для схемы экранирования.

Полученная строка предваряется prefix и завершается suffix. Оба значения могут быть пустыми строками.

См. также:

  • процедура unescape для обратного

действия

Исходный код Редактировать
proc unescape(s: string; prefix = "\""; suffix = "\""): string {...}{.noSideEffect,
    gcsafe, extern: "nsuUnescape", raises: [ValueError], tags: [].}

Раскрашивает строку s.

Это дополнение к процедуре escape, так как выполняет обратные операции.

Если s не начинается с prefix и не заканчивается suffix будет возбуждено исключение ValueError.

Исходный код Редактировать
proc validIdentifier(s: string): bool {...}{.noSideEffect, gcsafe,
                                        extern: "nsuValidIdentifier",
                                        raises: [], tags: [].}

Возвращает true, если s является допустимым идентификатором.

Допустимый идентификатор начинается с символа из набора IdentStartChars и далее содержит любое количество символов из набора IdentChars.

Пример:

doAssert "abc_def08".validIdentifier
Исходный код Редактировать
proc formatBiggestFloat(f: BiggestFloat; format: FloatFormatMode = ffDefault;
                        precision: range[-1 .. 32] = 16; decimalSep = '.'): string {...}{.
    noSideEffect, gcsafe, extern: "nsu$1", raises: [], tags: [].}

Преобразует значение с плавающей запятой f в строку.

Если format == ffDecimal то точность — это количество цифр, отображаемых после десятичной точки. Если format == ffScientific то точность — это максимальное количество значащих цифр для вывода. Значение по умолчанию для precision — максимальное количество значащих цифр после десятичной точки для типа biggestFloat в Nim.

Если precision == -1, то будет выполнена попытка красивого форматирования.

Пример:

let x = 123.456
doAssert x.formatBiggestFloat() == "123.4560000000000"
doAssert x.formatBiggestFloat(ffDecimal, 4) == "123.4560"
doAssert x.formatBiggestFloat(ffScientific, 2) == "1.23e+02"
Исходный код Редактировать
proc formatFloat(f: float; format: FloatFormatMode = ffDefault;
                 precision: range[-1 .. 32] = 16; decimalSep = '.'): string {...}{.
    noSideEffect, gcsafe, extern: "nsu$1", raises: [], tags: [].}

Преобразует значение с плавающей запятой f в строку.

Если format == ffDecimal то точность — это количество цифр, отображаемых после десятичной точки. Если format == ffScientific то точность — это максимальное количество значащих цифр для вывода. Значение по умолчанию для precision — максимальное количество значащих цифр после десятичной точки для типа float в Nim.

Если precision == -1, то будет выполнена попытка красивого форматирования.

Пример:

let x = 123.456
doAssert x.formatFloat() == "123.4560000000000"
doAssert x.formatFloat(ffDecimal, 4) == "123.4560"
doAssert x.formatFloat(ffScientific, 2) == "1.23e+02"
Исходный код Редактировать
proc trimZeros(x: var string; decimalSep = '.') {...}{.noSideEffect, raises: [],
    tags: [].}

Удаляет завершающие нули из отформатированного значения с плавающей запятой x (должно быть объявлено как var).

Это изменяет x непосредственно, а не возвращает копию.

Пример:

var x = "123.456000000"
x.trimZeros()
doAssert x == "123.456"
Исходный код Редактировать
proc formatSize(bytes: int64; decimalSep = '.'; prefix = bpIEC;
                includeSpace = false): string {...}{.noSideEffect, raises: [],
    tags: [].}

Округляет и форматирует bytes.

По умолчанию использует стандартные двоичные префиксы IEC/ISO, поэтому 1024 будет отформатировано как 1KiB. Установите prefix в bpColloquial для использования общеупотребительных названий из стандарта SI (например, k для 1000, повторно используемого для 1024).

includeSpace может быть установлено в значение true для включения пробела между числом и единицей (например, 1 KiB).

См. также:

  • модуль strformat для интерполяции строк и форматирования

Пример:

doAssert formatSize((1'i64 shl 31) + (300'i64 shl 20)) == "2.293GiB"
doAssert formatSize((2.234*1024*1024).int) == "2.234MiB"
doAssert formatSize(4096, includeSpace = true) == "4 KiB"
doAssert formatSize(4096, prefix = bpColloquial, includeSpace = true) == "4 kB"
doAssert formatSize(4096) == "4KiB"
doAssert formatSize(5_378_934, prefix = bpColloquial, decimalSep = ',') == "5,13MB"
Исходный код Редактировать
proc formatEng(f: BiggestFloat; precision: range[0 .. 32] = 10;
               trim: bool = true; siPrefix: bool = false; unit: string = "";
               decimalSep = '.'; useUnitSpace = false): string {...}{.noSideEffect,
    raises: [], tags: [].}

Преобразует значение с плавающей точкой f в строку с использованием инженерной нотации.

Числа в диапазоне -1000.0<f<1000.0 будут отформатированы без экспоненты. Числа вне этого диапазона будут отформатированы как мантисса в диапазоне -1000.0<f<1000.0 и экспонента, которая всегда будет целым кратным 3, соответствующим масштабу SI-префиксов k, M, G, T и т. д. для чисел со значением больше 1 и m, μ, n, p и т. д. для чисел со значением меньше 1.

По умолчанию (trim=true и precision=10) отображается наиболее краткая форма, которая точно (до максимума 10 десятичных знаков) отображает значение. Например, 4.100000 будет отображено как 4.1 (математически идентично), а 4.1000003 — как 4.1000003.

Если trim установлено в true, хвостовые нули будут удалены; если false, количество цифр, указанное precision, всегда будет отображено.

precision может быть использовано для задания количества цифр после десятичной точки или (если trim имеет значение true) максимального количества отображаемых цифр.

formatEng(0, 2, trim=false) == "0.00"
formatEng(0, 2) == "0"
formatEng(0.053, 0) == "53e-3"
formatEng(52731234, 2) == "52.73e6"
formatEng(-52731234, 2) == "-52.73e6"

Если siPrefix установлено в true, число будет отображаться с SI-префиксом, соответствующим экспоненте. Например, 4100 будет отображаться как "4.1 k" вместо "4.1e3". Обратите внимание, что u используется для микро- вместо греческой буквы мю (μ) в соответствии с ISO 2955. Числа со значением вне диапазона 1e-18<f<1000e18 (1a<f<1000E) будут отображаться с экспонентой вместо SI-префикса, независимо от того, siPrefix имеет значение true или нет.

Если useUnitSpace имеет значение true, предоставленный единица будет добавлен к строке (со знаком пробела, как того требует стандарт SI). Это поведение немного отличается от добавления единицы к результату, так как положение пробела изменяется в зависимости от того, есть ли экспонента.

formatEng(4100, siPrefix=true, unit="V") == "4.1 kV"
formatEng(4.1, siPrefix=true, unit="V") == "4.1 V"
formatEng(4.1, siPrefix=true) == "4.1" # Note lack of space
formatEng(4100, siPrefix=true) == "4.1 k"
formatEng(4.1, siPrefix=true, unit="") == "4.1 " # Space with unit=""
formatEng(4100, siPrefix=true, unit="") == "4.1 k"
formatEng(4100) == "4.1e3"
formatEng(4100, unit="V") == "4.1e3 V"
formatEng(4100, unit="", useUnitSpace=true) == "4.1e3 " # Space with useUnitSpace=true

decimalSep используется в качестве разделителя десятичных знаков.

См. также:

  • Модуль strformat для интерполяции и форматирования строк
Исходный код Редактировать
proc addf(s: var string; formatstr: string; a: varargs[string, `$`]) {...}{.
    noSideEffect, gcsafe, extern: "nsuAddf", raises: [ValueError], tags: [].}
То же самое, что и add(s, formatstr % a), но более эффективно. Исходный код Редактировать
proc `%`(formatstr: string; a: openArray[string]): string {...}{.noSideEffect,
    gcsafe, extern: "nsuFormatOpenArray", raises: [ValueError], tags: [].}

Интерполирует строку формата со значениями из a.

Оператор подстановки выполняет подстановки строк в formatstr и возвращает изменённую formatstr. Это часто называется интерполяцией строк.

Лучше всего это объяснить на примере:

"$1 eats $2." % ["The cat", "fish"]

Результат:

"The cat eats fish."

Переменные подстановки (то, что после $) нумеруются от 1 до a.len. Чтобы получить строку без изменений, используйте $$. Нотация $# может использоваться для ссылки на следующую переменную подстановки:

"$# eats $#." % ["The cat", "fish"]

Переменные подстановки также могут быть словами (то есть [A-Za-z_]+[A-Za-z0-9_]*), в этом случае аргументы в a с чётными индексами являются ключами, а с нечётными — соответствующими значениями. Пример:

"$animal eats $food." % ["animal", "The cat", "food", "fish"]

Результат:

"The cat eats fish."

Переменные сравниваются с cmpIgnoreStyle. ValueError генерируется, если в оператор % была передана некорректно сформированная строка формата.

См. также:

  • Модуль strformat для интерполяции и форматирования строк
Исходный код Редактировать
proc `%`(formatstr, a: string): string {...}{.noSideEffect, gcsafe,
    extern: "nsuFormatSingleElem", raises: [ValueError], tags: [].}
Это то же самое, что и formatstr % [a] (см. % proc). Исходный код Редактировать
proc format(formatstr: string; a: varargs[string, `$`]): string {...}{.noSideEffect,
    gcsafe, extern: "nsuFormatVarargs", raises: [ValueError], tags: [].}

Это то же самое, что и formatstr % a (см. % proc), за исключением того, что оно поддерживает автоматическое преобразование в строку.

См. также:

  • Модуль strformat для интерполяции и форматирования строк
Исходный код Редактировать
proc strip(s: string; leading = true; trailing = true;
           chars: set[char] = Whitespace): string {...}{.noSideEffect, gcsafe,
    extern: "nsuStrip", raises: [], tags: [].}

Удаляет ведущие или хвостовые chars (по умолчанию: символы пробела) из s и возвращает получившуюся строку.

Если leading имеет значение true (по умолчанию), ведущие chars удаляются. Если trailing имеет значение true (по умолчанию), хвостовые chars удаляются. Если оба значения false, строка возвращается без изменений.

См. также:

  • stripLineEnd proc

Пример:

let a = "  vhellov   "
let b = strip(a)
doAssert b == "vhellov"

doAssert a.strip(leading = false) == "  vhellov"
doAssert a.strip(trailing = false) == "vhellov   "

doAssert b.strip(chars = {'v'}) == "hello"
doAssert b.strip(leading = false, chars = {'v'}) == "vhello"

let c = "blaXbla"
doAssert c.strip(chars = {'b', 'a'}) == "laXbl"
doAssert c.strip(chars = {'b', 'a', 'l'}) == "X"
Исходный код Редактировать
proc stripLineEnd(s: var string) {...}{.raises: [], tags: [].}
Возвращает s с удалёнными одним из этих суффиксов: \r, \n, \r\n, \f, \v (по максимуму один экземпляр). Например, может быть полезно в сочетании с osproc.execCmdEx. Также известно как: chomp

Пример:

var s = "foo\n\n"
s.stripLineEnd
doAssert s == "foo\n"
s = "foo\r\n"
s.stripLineEnd
doAssert s == "foo"
Исходный код Редактировать
proc isEmptyOrWhitespace(s: string): bool {...}{.noSideEffect, gcsafe,
    extern: "nsuIsEmptyOrWhitespace", raises: [], tags: [].}
Проверяет, является ли s пустой или состоит только из символов пробела. Исходный код Редактировать

Итераторы

iterator split(s: string; sep: char; maxsplit: int = -1): string {...}{.raises: [],
    tags: [].}

Разделяет строку s на подстроки с использованием одного разделителя.

Подстроки разделены символом sep. Код:

for word in split(";;this;is;an;;example;;;", ';'):
  writeLine(stdout, word)

Результат:

""
""
"this"
"is"
"an"
""
"example"
""
""
""

См. также:

  • Итератор rsplit
  • Итератор splitLines
  • Итератор splitWhitespace
  • Процедура split
Исходный код Изменить
iterator split(s: string; seps: set[char] = Whitespace; maxsplit: int = -1): string {...}{.
    raises: [], tags: [].}

Разделяет строку s на подстроки с использованием группы разделителей.

Подстроки разделены подстрокой, содержащей только seps.

for word in split("this\lis an\texample"):
  writeLine(stdout, word)

… генерирует этот вывод:

"this"
"is"
"an"
"example"

И следующий код:

for word in split("this:is;an$example", {';', ':', '$'}):
  writeLine(stdout, word)

… производит тот же вывод, что и первый пример. Код:

let date = "2012-11-20T22:08:08.398990"
let separators = {' ', '-', ':', 'T'}
for number in split(date, separators):
  writeLine(stdout, number)

… приводит к:

"2012"
"11"
"20"
"22"
"08"
"08.398990"

См. также:

  • Итератор rsplit
  • Итератор splitLines
  • Итератор splitWhitespace
  • Процедура split
Исходный код Изменить
iterator split(s: string; sep: string; maxsplit: int = -1): string {...}{.raises: [],
    tags: [].}

Разделяет строку s на подстроки, используя строковый разделитель.

Подстроки разделены строкой sep. Код:

for word in split("thisDATAisDATAcorrupted", "DATA"):
  writeLine(stdout, word)

Результат:

"this"
"is"
"corrupted"

См. также:

  • Итератор rsplit
  • Итератор splitLines
  • Итератор splitWhitespace
  • Процедура split
Исходный код Изменить
iterator rsplit(s: string; sep: char; maxsplit: int = -1): string {...}{.raises: [],
    tags: [].}
Разделяет строку s на подстроки справа, используя строковый разделитель. Работает точно так же, как итератор split, но в обратном порядке.
for piece in "foo:bar".rsplit(':'):
  echo piece

Результат:

"bar"
"foo"

Подстроки разделены справа символом sep.

См. также:

  • Итератор split
  • Итератор splitLines
  • Итератор splitWhitespace
  • Процедура rsplit
Исходный код Изменить
iterator rsplit(s: string; seps: set[char] = Whitespace; maxsplit: int = -1): string {...}{.
    raises: [], tags: [].}
Разделяет строку s на подстроки справа, используя строковый разделитель. Работает точно так же, как итератор split, но в обратном порядке.
for piece in "foo bar".rsplit(WhiteSpace):
  echo piece

Результат:

"bar"
"foo"

Подстроки разделены справа набором символов seps

См. также:

  • Итератор split
  • Итератор splitLines
  • Итератор splitWhitespace
  • Процедура rsplit
Исходный код Изменить
iterator rsplit(s: string; sep: string; maxsplit: int = -1;
                keepSeparators: bool = false): string {...}{.raises: [], tags: [].}
Разделяет строку s на подстроки справа, используя строковый разделитель. Работает точно так же, как итератор split, но в обратном порядке.
for piece in "foothebar".rsplit("the"):
  echo piece

Результат:

"bar"
"foo"

Подстроки разделены справа строкой sep

См. также:

  • Итератор split
  • Итератор splitLines
  • Итератор splitWhitespace
  • Процедура rsplit
Исходный код Изменить
iterator splitLines(s: string; keepEol = false): string {...}{.raises: [], tags: [].}

Разделяет строку s на содержащие строки.

Поддерживаются все комбинации символов новой строки (CR, LF, CR-LF). Результирующие строки не содержат концевых символов новой строки, если параметр keepEol не установлен в true.

Пример:

for line in splitLines("\nthis\nis\nan\n\nexample\n"):
  writeLine(stdout, line)

Результат:

""
"this"
"is"
"an"
""
"example"
""

См. также:

  • Итератор splitWhitespace
  • Процедура splitLines
Исходный код Изменить
iterator splitWhitespace(s: string; maxsplit: int = -1): string {...}{.raises: [],
    tags: [].}

Разделяет строку s по пробелам, удаляя ведущие и хвостовые пробелы при необходимости. Если maxsplit указан и положителен, то не более maxsplit разделений.

Следующий код:

let s = "  foo \t bar  baz  "
for ms in [-1, 1, 2, 3]:
  echo "------ maxsplit = ", ms, ":"
  for item in s.splitWhitespace(maxsplit=ms):
    echo '"', item, '"'

… приведёт к:

------ maxsplit = -1:
"foo"
"bar"
"baz"
------ maxsplit = 1:
"foo"
"bar  baz  "
------ maxsplit = 2:
"foo"
"bar"
"baz  "
------ maxsplit = 3:
"foo"
"bar"
"baz"

См. также:

  • Итератор splitLines
  • Процедура splitWhitespace
Исходный код Изменить
iterator tokenize(s: string; seps: set[char] = Whitespace): tuple[token: string,
    isSep: bool] {...}{.raises: [], tags: [].}

Токенизирует строку s на подстроки.

Подстроки разделены подстрокой, содержащей только seps. Пример:

for word in tokenize("  this is an  example  "):
  writeLine(stdout, word)

Результат:

("  ", true)
("this", false)
(" ", true)
("is", false)
(" ", true)
("an", false)
("  ", true)
("example", false)
("  ", true)
Исходный код Изменить

Экспорт

toLower, toLower, toUpper, toUpper

© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/strutils.html

Spec-Zone.ru

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