rebol document

Глава 8 - Серия строк

REBOL/Core Руководство пользователя
Основное содержание
Отправьте нам отзыв

Содержание:

1. Строковые функции
2. Преобразование значений в строки
2.1 Join
2.2 Rejoin
2.3 Form
2.4 Reform
2.5 Mold
2.6 Remold
2.7 String Spacing Functions
2.8 Uppercase and Lowercase
2.9 Checksum
2.10 Compression and Decompression
2.11 Number Base Conversion
2.12 Internet Hexadecimal Decoding

1. Строковые функции

Существует множество функций, которые работают со строками или создают их. Доступны функции для изменения строк, поиска строк, сжатия и распаковки строк, изменения интервала между строками, синтаксического анализа строк и преобразования строк. Эти функции работают со всеми типами данных, связанными со строками, такими как 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преобразовать строку в базовое значение
 debasecпреобразовать базовое значение в строку
 dehexпреобразовать шестнадцатеричные значения ASCII в символы

2. Преобразование значений в строки

2.1 Join

Функция 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

2.2 Rejoin

Функция rejoin идентична join, за исключением того, что принимает один аргумент, блок.

print rejoin ["try" 1 2 3]
try123
print rejoin ["h" 'e #"l" (to-char 108) "o"]
hello

2.3 Form

Функция 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.4 Reform

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

str1: "Сегодняшняя дата:"
str2: "Текущее время:"
print reform [str1 now/date newline str2 now/time]
Сегодняшняя дата: 30-Jun-2000 Текущее время: 14:41:44

Функция print основана на функции reform.

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}

2.8 Uppercase и Lowercase

Есть две функции для изменения регистра символов: 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 возвращает контрольную сумму строкового значения. Существует три типа контрольных сумм, которые можно вычислить:

 CRC24-битная контрольная сумма с круговой избыточностью
 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


Updated 8-Apr-2005 - Copyright REBOL Technologies - Formatted with MakeDoc2
REBOL.com Documents Manual Dictionary Library Feedback