Существует множество функций, которые работают со строками или создают их. Доступны функции для изменения строк, поиска строк, сжатия и распаковки строк, изменения интервала между строками, синтаксического анализа строк и преобразования строк. Эти функции работают со всеми типами данных, связанными со строками, такими как string!, binary!, tag!, file!,
URL!, email!, и issue!.
Функции создания, изменения и поиска строк описаны в главе «Серии». Они включают элементы, перечисленные в строковых функциях.
| | copy | скопировать всю строку или ее часть
|
| | make | выделить память для строки
|
| | insert | вставить символ или подстроку в другую строку
|
| | remove | удалить один или несколько символов из строки
|
| | change | изменить один или несколько символов в строке
|
| | append | вставить символ или подстроку в конец строки
|
| | find | найти или сопоставить символ или строку в другой строке
|
| | replace | найти строку и заменить ее другой строкой
|
Кроме того, были охвачены такие функции перемещения, как next, back, head, и tail. Они используются для изменения положения струн. Кроме того, функции последовательного тестирования позволяют определить вашу позицию в строке.
В этой главе будут представлены функции, которые преобразуют значения REBOL в строки. Эти функции используются часто, а также функциями print и probe. Они включают:
| | form | преобразовывать значения с пробелами и в удобочитаемом формате
|
| | mold | конвертировать значения в читаемый формат REBOL
|
| | join | преобразовывать значения без пробелов
|
| | reform | уменьшает значения перед их формированием
|
| | remold | уменьшает значения перед их формованием
|
| | rejoin | уменьшает значения перед присоединением к ним
|
В этой главе также будут описаны следующие строковые функции:
| | detab | заменить табуляцию пробелами
|
| | entab | заменить пробелы табуляцией
|
| | trim | удалить пробелы или линии вокруг строк
|
| | uppercase | преобразовать строку в верхний регистр
|
| | lowercase | преобразовать строку в нижний регистр
|
| | checksum | вычислить контрольную сумму для строки
|
| | compress | запоковать/сжать строку
|
| | decompress | рапаковать строку
|
| | enbase | преобразовать строку в базовое значение
|
| | debase | cпреобразовать базовое значение в строку
|
| | dehex | преобразовать шестнадцатеричные значения ASCII в символы
|
Функция join fпринимает два аргумента и объединяет их в одну серию.
Тип данных возвращаемой серии основан на значении первого аргумента. Когда первым аргументом является значение серии, возвращается этот тип серии.
str: "abc"
file: %file
url: http://www.rebol.com/
probe join str [1 2 3]
abc123
probe join file ".txt"
%file.txt
probe join url %index.html
http://www.rebol.com/index.html
Когда первый аргумент не является рядом, join сначала преобразует его в строку, а затем выполняет добавление:
print join $11 " долларов"
$11.00 долларов
print join 9:11:01 " elapsed"
9:11:01 elapsed
print join now/date " -- сегодня"
30-Jun-2000 -- сегодня
print join 255.255.255.0 " netmask"
255.255.255.0 netmask
print join 412.452 " световых лет от нас"
412.452 световых лет от нас
Когда вторым аргументом для join является блок, значения этого блока оцениваются и добавляются к возвращаемой серии.
print join "a" ["b" "c" 1 2]
abc12
print join %/ [%dir1/ %sub-dir/ %filename ".txt"]
%/dir1/sub-dir/filename.txt
print join 11:09:11 ["AM" " on " now/date]
11:09:11AM on 30-Jun-2000
print join 312.423 [123 987 234]
312.423123987234
Функция form преобразует значение в строку:
print form $1.50
$1.50
print type? $1.50
money
print type? form $1.50
string
В следующем примере form используется для поиска числа по его десятичному значению:
blk: [11.22 44.11 11.33 11.11]
foreach num blk [if find form num ".11" [print num]]
44.11
11.11
Когда form используется в блоке, все значения в блоке преобразуются в строковые значения с пробелами между каждым значением:
print form [11.22 44.11 11.33]
11.22 44.11 11.33
Функция form не оценивает значения блока. Это приводит к преобразованию слов в строковые значения:
print form [a block of undefined words]
a block of undefined words
print form [33.44 num "-- unevaluated string:" str]
33.44 num -- unevaluated string: str
2.5 Mold
Функция mold преобразует значение в строку, которую может использовать REBOL. Строки, созданные с помощью mold, можно преобразовать обратно в значения с помощью функции load.
blk: [[11 * 4] ($15 - $3.89) "eleven dollars"]
probe blk
[[11 * 4] ($15.00 - $3.89) "eleven dollars"]
molded-blk: mold blk
probe molded-blk
{[[11 * 4] ($15.00 - $3.89) "eleven dollars"]}
print type? blk
block
print type? molded-blk
string
probe first blk
[11 * 4]
<A name=pgfId-539552>probe first molded-blk
#"["
Строки, возвращенные из mold, могут быть загружены REBOL:
new-blk: load molded-blk
probe new-blk
[[11 * 4] ($15.00 - $3.89) "eleven dollars"]
print type? new-blk
block
probe first new-blk
[11 * 4]
Функция mold не оценивает значения блока.
money: $11.11
sub-blk: [inside another block mold this is unevaluated]
probe mold [$22.22 money "-- unevaluated block:" sub-blk]
{[$22.22 money "-- unevaluated block:" sub-blk]}
probe mold [a block of undefined words]
[a block of undefined words]
2.6 Remold
Функция remold работает так же, как и mold, за исключением того, что блоки уменьшаются до преобразования.
str1: "Сегодняшняя дата::"
probe remold [str1 now/date]
{["Сегодняшняя дата:" 30-Jun-2000]}
2.7 Функции разделения строк
2.7.1 Trim
Функция trim удаляет лишние пробелы из строки.
Функция trim по умолчанию заключается в удалении лишних пробелов в начале и конце строки:
str: " строка текста с пробелами в начале и конце "
print trim str
строка текста с пробелами в начале и конце
Обратите внимание, что строка изменяется в процессе:
print str
строка текста с пробелами в начале и конце
Чтобы обрезать копию строки, напишите:
print trim copy str
Чтобы обрезать копию строки, напишите:
Trim включает в себя ряд уточнений, чтобы указать, где нужно удалить пробел в строке:
| | /head | удаляет пробел в начала строки
|
| | /tail | удаляет пробел в конце строки
|
| | /auto | удаляет пробел из каждой строки относительно первой строки
|
| | /lines | удаляет символы новой строки, заменяя их пробелами
|
| | /all | - удаляет все пробелы
|
| | /with | удаляет все указанные символы
|
Используйте уточнения /head и /tail для обрезки с любого конца строки:
probe trim/head copy str
строка текста с пробелами в начале и конце
probe trim/tail copy str
строка текста с пробелами в начале и конце
Используйте уточнение /auto, чтобы вырезать ведущие пробелы из нескольких строк, не трогая отступы:
str: {
indent text
indent text
indent text
indent text
indent text
}
print str
indent text
indent text
indent text
indent text
indent text
probe trim/auto copy str
{indent text
indent text
indent text
indent text
indent text
}
Используйте /lines для обрезки начала и конца строк, а также преобразования новой строки в пробелы:
probe trim/lines copy str
{indent text indent text indent text indent text indent text}
Используйте /all, чтобы удалить все пробелы:
probe trim/all copy str
indenttextindenttextindenttextindenttextindenttext
Уточнением /with удалит все символы, которые вы укажете. В следующем примере удалены пробелы, разрывы строк и символы e и t:
probe trim/with copy str " ^/et"
indnxindnxindnxindnxindnx
2.7.2 Detab и Entab
Функции detab и entab преобразует символы табуляции в пробелы и пробелы в закладках.
str:
{^(tab)line one
^(tab)^(tab)line two
^(tab)^(tab)^(tab)line three
^(tab)line^(tab)full^(tab)of^(tab)tabs}
print str
line one
line two
line three
line full of tabs
По умолчанию функция detab преобразует табуляторы в четыре пробела (стандартный интервал REBOL). Все табуляции в строке будут преобразованы в пробелы, независимо от того, где они расположены.
probe detab str
{ line one
line two
line three
line full of tabs}
Обратите внимание, что функции detab и entab влияют на строку, указанную в качестве аргумента. Чтобы изменить копию исходной строки, используйте функцию копирования.
Функция entab преобразует пробелы в табуляции. Каждые четыре пробела будут преобразованы в одну табуляцию. Только пробелы в начале строки будут преобразованы в табуляцию.
probe entab str
{^-line one
^-^-line two
^-^-^-line three
^-line^-full^-of^-tabs}
Вы можете использовать уточнение /size, чтобы указать количество пробелов в табуляции. Например, если вы хотите преобразовать каждую табуляцию в восемь пробелов или преобразовать каждые восемь пробелов в табуляцию, вы можете использовать этот пример:
probe detab/size str 8
{ line one
line two
line three
line full of tabs}
probe entab/size str 8
{^-line one
^-^-line two
^-^-^-line three
^-line^-full^-of^-tabs}
Есть две функции для изменения регистра символов: uppercase и lowercase. Функция uppercase принимает строковый аргумент и преобразует его символы в верхний регистр:
print uppercase "SamPle TExT, tO test CASES"
SAMPLE TEXT, TO TEST CASES
Функция lowercase преобразует символы в нижний регистр:
print lowercase "Sample TEXT, tO teST Cases"
sample text, to test cases
Чтобы преобразовать только часть строки, используйте уточнение /part:
print upppercase/part "ukiah" 1
Ukiah
2.9 Checksum
Функция checksum возвращает контрольную сумму строкового значения. Существует три типа контрольных сумм, которые можно вычислить:
| | CRC | 24-битная контрольная сумма с круговой избыточностью
|
| | TCP | стандартная 16-битная контрольная сумма Интернета
|
| | Secure | криптографически безопасная контрольная сумма
|
По умолчанию вычисляется контрольная сумма CRC:
print checksum "hello"
52719
print checksum (read http://www.rebol.com/)
356358
Чтобы вычислить 16-битную контрольную сумму TCP, используйте уточнение /tcp
refinement:
print checksum/tcp "hello"
10943
Безопасная контрольная сумма вернет двоичное значение, а не целое число. Используйте уточнение /secure для вычисления безопасной контрольной суммы:
print checksum/secure "hello"
#{AAF4C61DDCC5E8A2DABEDE0F3B482CD9AEA9434D}
2.10 Compression и Decompression
Функция compress сжимает строку и возвращает двоичный тип данных. В следующем примере показывается разница в размере сжатого и исходного текста, помещённого в переменную str:
Str:
{I wanted the gold, and I sought it,
I scrabbled and mucked like a slave.
Was it famine or scurvy -- I fought it;
I hurled my youth into a grave.
I wanted the gold, and I got it --
Came out with a fortune last fall, --
Yet somehow life's not what I thought it,
And somehow the gold isn't all.}
print [size? str "bytes"]
306 bytes
bin: compress str
print [size? bin "bytes"]
156 bytes
Обратите внимание, что результатом сжатия является двоичный тип данных.
Функция decompress распаковывает ранее сжатую строку.
print decompress bin
I wanted the gold, and I sought it,
I scrabbled and mucked like a slave.
Was it famine or scurvy -- I fought it;
I hurled my youth into a grave.
I wanted the gold, and I got it --
Came out with a fortune last fall, --
Yet somehow life's not what I thought it,
And somehow the gold isn't all.
Сохраните ваши данные
Всегда храните несжатые резервные копии сжатых данных. Если вы потеряете только один байт из сжатого двоичного файла, восстановить данные может быть сложно. Не храните файловые архивы в сжатом формате, если у вас нет несжатых копий.
2.11 Преобразование числовой базы
Для отправки в виде текста двоичные строки должны быть преобразованы в шестнадцатеричную кодировку или кодировку base64. Это часто делается для электронной почты и содержания групп новостей.
Функция enbase закодирует двоичную строку:
line: to-binary "No! There's a land!"
e-line: enbase line
== "Tm8hIFRoZXJlJ3MgYSBsYW5kIQ=="
Закодированные строки можно декодировать с помощью функции debase. Обратите внимание, что строка сначала была преобразованна в двоичные данные, затем они были закодированны и результатом кодирования двочных данных является строка. Чтобы после раскодирования преобразовать их обратно в строку, используйте функцию to-string.
b-line: debase e-line
print type? b-line
binary
probe b-line
#{4E6F2120546865726527732061206C616E6421}
print to-string b-line
No! There's a land!
Уточнение /base может быть использовано с enbase и debase, чтобы указать base2 (двоичный), base16 (шестнадцатеричный), или кодирование base64.
Вот несколько примеров использования base2:
e2-str: enbase/base "a" 2
print e2-str
01100001
b2-str: debase/base e2-str 2
print type? b2-str
binary
probe b2-str
#{61}
print to-string b2-str
a
Вот несколько примеров использования base16:
e16-line: enbase/base line 16
print e16-line
4E6F2120546865726527732061206C616E6421
b16-line: debase/base e16-line 16
print type? b16-line
binary
probe b16-line
#{4E6F2120546865726527732061206C616E6421}
print to-string b16-line
No! There's a land!
2.12 Шестнадцатеричное декодирование в Интернете/h3>
Функция dehex преобразует символы в шестнадцатеричной кодировке в стиле URL-адреса Интернета и CGI в строки. Шестнадцатеричные представления ASCII появляются в строке URL или CGI как %xx, где xx - шестнадцатеричное значение..
str: "there%20seem%20to%20be%20no%20spaces"
print dehex str
there seem to be no spaces
print dehex "%68%65%6C%6C%6F"
hello