Строки в Lua

Строка — это последовательность символов, состоящая из цифр, букв и знаков подчеркивания.

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

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

В Lua строки можно представить следующими тремя способами:

  • Последовательность символов между одинарными кавычками.

    local str1 = 'This is a string.'
    local str2 = "This is also a string."
  • Последовательность символов между двойными кавычками.

    local str = "Hello, "
    str = str .. "World!"  -- 创建一个新的字符串并将其赋值给str
    print(str)  -- 输出 "Hello, World!"
  • [[и]]Последовательность символов между [[ и ]].

    local multilineString = [[
    This is a multiline string.
    It can contain multiple lines of text.
    No need for escape characters.
    ]]
    
    print(multilineString)

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

Пример

string1 = "Lua"
print("\"Строка 1 — это\"",string1)
string2 = 'example.com'
print("Строка 2 — это",string2)

string3 = [[Руководство по Lua]]
print("Строка 3 — это",string3)

Результат выполнения приведённого выше кода:

"字符串 1 是"    Lua
字符串 2 是    example.com
字符串 3 是    "Lua 教程"

Вычисление длины строки

В Lua, чтобы вычислить длину строки (т.е. количество символов в строке), можно использоватьstring.lenфункцию илиutf8.lenфункцию, а для строк, содержащих китайские символы, обычно используютutf8.len,string.lenФункция используется для вычисления длины строк, содержащих только символы ASCII.

Пример

local myString = "Привет, EXAMPLE!"

-- Вычислить длину строки (количество символов)
local length = string.len(myString)

print(length) -- Вывод 14

В приведённом выше примере строка myString содержит только ASCII-символы, поэтомуstring.lenфункция может точно вернуть длину строки.

Для строк, содержащих китайские символы, используйтеutf8.lenфункцию:

Пример

local myString = "Hello, world!"

-- Вычислить длину строки (количество символов)
local length1 = utf8.len(myString)
print(length1) -- Вывод 10

-- Функция string.len приведёт к неточным результатам
local length2 = string.len(myString)
print(length2) -- Вывод 14

Результат вывода:

10
14

Escape-символы используются для представления символов, которые невозможно отобразить напрямую, таких как клавиша Backspace, возврат каретки и т. д. Например, чтобы включить двойные кавычки в строку, можно использовать\。

Все escape-символы и их соответствующие значения:

Экранирующий символ
Значение
Значение ASCII (десятичное)
\a
Звонок (BEL)
007
\b
Возврат на одну позицию (BS), перемещает текущую позицию в предыдущий столбец
008
\f
Перевод страницы (FF), перемещает текущую позицию в начало следующей страницы
012
\n
Перевод строки (LF), перемещает текущую позицию в начало следующей строки
010
\r
Возврат каретки (CR), перемещает текущую позицию в начало текущей строки
013
\t
Горизонтальная табуляция (HT) (переход к следующей позиции табуляции)
009
\v
Вертикальная табуляция (VT)
011
\\
Представляет символ обратной косой черты '\\'
092
\'
Представляет символ одинарной кавычки (апостроф)
039
\"
Представляет символ двойной кавычки
034
\0
Нулевой символ (NULL)
000
\ddd
Любой символ, представленный 1–3-значным восьмеричным числом
Трёхзначное восьмеричное число
\xhh
Любой символ, представленный 1-2-значным шестнадцатеричным числом
Двузначное шестнадцатеричное число

Операции со строками

Lua предоставляет множество методов для поддержки операций со строками:

Порядковый номерМетод и назначение
1string.upper(argument):
Преобразует всю строку в прописные буквы.
2string.lower(argument):
Преобразует всю строку в строчные буквы.
3string.gsub(mainString,findString,replaceString,num)

Заменяет внутри строки.

mainString — строка, над которой выполняется операция, findString — заменяемый символ, replaceString — символ замены, num — количество замен (можно опустить, тогда заменяются все), например:
> string.gsub("aaaa","a","z",3);
zzza    3
4string.find (str, substr, [init, [plain]])

В указанной целевой строке str выполняется поиск указанного содержимого substr. Если найдена совпадающая подстрока, возвращаются начальный и конечный индексы подстроки; если она не существует, возвращается nil.

initЗадаёт начальную позицию поиска, по умолчанию 1. Может быть отрицательным числом, указывающим количество символов, отсчитываемых с конца.

plainУказывает, использовать ли простой режим, по умолчанию false. true выполняет только простой поиск подстроки, false означает использование сопоставления с шаблоном регулярного выражения.

В следующем примере находятся начальный и конечный индексы строки "Lua":

> string.find("Hello Lua user", "Lua", 1) 
7    9
5string.reverse(arg)
Реверс строки
> string.reverse("Lua")
auL
6string.format(...)
Возвращает форматированную строку, аналогично printf
> string.format("the value is:%d",4)
the value is:4
7string.char(arg) and string.byte(arg[,int])
char преобразует целые числа в символы и объединяет их, byte преобразует символы в целочисленные значения (можно указать конкретный символ, по умолчанию — первый символ).
> string.char(97,98,99,100)
abcd
> string.byte("ABCD",4)
68
> string.byte("ABCD")
65
>
8string.len(arg)
Вычисляет длину строки.
string.len("abc")
3
9string.rep(string, n)
Возвращает n копий строки
> string.rep("abcd",2)
abcdabcd
10..
Объединяет две строки
> print("www.example.".."com")
www.example.com
11string.gmatch(str, pattern)
Возвращает функцию-итератор. Каждый раз, когда эта функция вызывается, она возвращает следующую подстроку, найденную в строке str, которая соответствует описанию шаблона. Если строка, описанная параметром pattern, не найдена, функция-итератор возвращает nil.
> for word in string.gmatch("Hello Lua user", "%a+") do print(word) end
Hello
Lua
user
12string.match(str, pattern, init)
string.match() ищет только первое совпадение в исходной строке str. Параметр init необязателен и указывает начальную точку поиска, по умолчанию равную 1.
При успешном совпадении функция возвращает все результаты захвата в выражении совпадения; если маркеры захвата не установлены, она возвращает всю совпавшую строку. Если успешного совпадения нет, она возвращает nil.
> = string.match("I have 2 questions for you.", "%d+ %a+")
2 questions

> = string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)"))
2, "questions"

Подстрока строки

Извлечение подстроки использует метод sub().

string.sub() используется для извлечения подстроки. Его прототип:

string.sub(s, i [, j])

Описание параметра:

  • s: строка, из которой извлекается подстрока.
  • i: начальная позиция извлечения.
  • j: конечная позиция извлечения; по умолчанию -1 — последний символ.

Пример


-- Строка
local sourcestr = "prefix--examplegoogletaobao--suffix"
print("\nИсходная строка ", string.format("%q", sourcestr))

-- Извлечь часть, с 4-й по 15-ю
local first_sub = string.sub(sourcestr, 4, 15)
print("\nПервое извлечение ", string.format("%q", first_sub))

-- Взять префикс строки, с 1-й по 8-ю
local second_sub = string.sub(sourcestr, 1, 8)
print("\nВторое извлечение ", string.format("%q", second_sub))

-- Извлечь последние 10 символов
local third_sub = string.sub(sourcestr, -10)
print("\nТретье извлечение ", string.format("%q", third_sub))

-- Индекс вне диапазона, вывести исходную строку
local fourth_sub = string.sub(sourcestr, -100)
print("\nЧетвёртое извлечение ", string.format("%q", fourth_sub))

Результат выполнения приведённого выше кода:

原始字符串    "prefix--examplegoogletaobao--suffix"

第一次截取    "fix--exampleg"

第二次截取    "prefix--"

第三次截取    "ao--suffix"

第四次截取    "prefix--examplegoogletaobao--suffix"

Преобразование регистра строк

Следующий пример демонстрирует, как преобразовать регистр строк:

Пример

string1 = "Lua";
print(string.upper(string1))
print(string.lower(string1))

Результат выполнения приведённого выше кода:

LUA
lua

Поиск и обратный порядок строк

Следующий пример демонстрирует, как выполнять операции поиска и обратного порядка над строками:

Пример

string = "Lua Tutorial"
-- Поиск строки
print(string.find(string,"Tutorial"))
reversedString = string.reverse(string)
print("The new string is",reversedString)

Результат выполнения приведённого выше кода:

5    12
新字符串为    lairotuT auL

Форматирование строк

Lua предоставляетstring.format()функцию для генерации строк с определенным форматом. Первый параметр функции — это формат, за которым следуют различные данные, соответствующие каждому коду в формате.

Благодаря наличию строки формата читаемость получаемых длинных строк значительно улучшается. Формат этой функции очень похож на printf() в C.

Следующий пример демонстрирует, как выполнять операции форматирования строк:

Строка формата может содержать следующие escape-последовательности:

  • %c - принимает число и преобразует его в соответствующий символ в таблице ASCII
  • %d, %i - принимают число и преобразуют его в формат целого числа со знаком
  • %o — принимает число и преобразует его в восьмеричный формат
  • %u — принимает число и преобразует его в формат беззнакового целого числа
  • %x — принимает число и преобразует его в шестнадцатеричный формат, используя строчные буквы
  • %X — принимает число и преобразует его в шестнадцатеричный формат, используя прописные буквы
  • %e — принимает число и преобразует его в формат научной нотации, используя строчную e
  • %E — принимает число и преобразует его в формат научной нотации, используя прописную E
  • %f — принимает число и преобразует его в формат с плавающей запятой
  • %g(%G) — принимает число и преобразует его в более короткий из форматов %e (%E, соответствующий %G) и %f
  • %q — принимает строку и преобразует её в формат, который может быть безопасно прочитан компилятором Lua
  • %s — принимает строку и форматирует её в соответствии с заданными параметрами.

Чтобы дополнительно уточнить формат, после знака % можно добавить параметры. Параметры читаются в следующем порядке:

  • (1) Знак: знак + указывает, что следующий числовой спецификатор заставит положительные числа отображаться со знаком плюс. По умолчанию знак отображается только у отрицательных чисел.
  • (2) Заполнитель: 0, используется для дополнения, когда в дальнейшем указана ширина строки. Если не заполнен, заполнителем по умолчанию является пробел.
  • (3) Флаг выравнивания: Когда указана ширина строки, по умолчанию используется выравнивание по правому краю; добавление знака - меняет его на выравнивание по левому краю.
  • (4) Значение ширины
  • (5) Количество десятичных знаков / усечение строки: Дробная часть n, добавляемая после значения ширины. Если за ней следует f (спецификатор для чисел с плавающей запятой, например, %6.3f), она задаёт для числа с плавающей запятой сохранение только n десятичных знаков; если за ней следует s (спецификатор для строки, например, %5.3s), она задаёт для строки отображение только первых n символов.

Пример

string1 = "Lua"
string2 = "Tutorial"
number1 = 10
number2 = 20
-- Базовое форматирование строк
print(string.format("Basic formatting %s %s",string1,string2))
-- Форматирование даты
date = 2; month = 1; year = 2014
print(string.format("Date formatting %02d/%02d/%04d", date, месяц, год))
-- Форматирование десятичных чисел
print(string.format("%.4f",1/3))

Результат выполнения приведённого выше кода:

基本格式化 Lua Tutorial
日期格式化 02/01/2014
0.3333

Другие примеры:

Пример

string.format("%c", 83)                 -- Вывод S
string.format("%+d", 17.0)              -- Вывод +17
string.format("%05d", 17)               -- Вывод 00017
string.format("%o", 17)                 -- Вывод 21
string.format("%u", 3.14)               -- Вывод 3
string.format("%x", 13)                 -- Вывод d
string.format("%X", 13)                 -- Вывод D
string.format("%e", 1000)               -- Вывод 1.000000e+03
string.format("%E", 1000)               -- Вывод 1.000000E+03
string.format("%6.3f", 13)              -- Вывод 13.000
string.format("%q", "One\nTwo")         -- Вывод "One\
                                        --   Two"
string.format("%s", "monkey")           -- Вывод monkey
string.format("%10s", "monkey")         -- Вывод monkey
string.format("%5.3s", "monkey")        -- Вывод mon

Преобразование символов и целых чисел

В следующем примере демонстрируется преобразование между символами и целыми числами:

Пример

-- Преобразование символа
-- Преобразовать первый символ
print(string.byte("Lua"))
-- Преобразовать третий символ
print(string.byte("Lua",3))
-- Преобразовать последний символ
print(string.byte("Lua",-1))
-- Второй символ
print(string.byte("Lua",2))
-- Преобразовать предпоследний символ
print(string.byte("Lua",-2))

-- Преобразовать целочисленный ASCII-код в символ
print(string.char(97))

Результат выполнения приведённого выше кода:

76
97
97
117
117
a

Другие распространённые функции

Следующий пример демонстрирует другие операции со строками, такие как вычисление длины строки, конкатенация строк, повторение строк и т. д.:

Пример

string1 = "www."
string2 = "example"
string3 = ".com"
-- Используйте .. для конкатенации строк
print("Объединённая строка",string1..string2..string3)

-- Длина строки
print("Длина строки ",string.len(string2))

-- Скопировать строку 2 раза
repeatedString = string.rep(string2,2)
print(repeatedString)

Результат выполнения приведённого выше кода:

连接字符串    www.example.com
字符串长度     6
exampleexample

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

Шаблоны сопоставления в Lua описываются непосредственно с помощью обычных строк. Они используются в функциях сопоставления с шаблонамиstring.find, string.gmatch, string.gsub, string.match。

Вы также можете использовать классы символов в строках шаблонов.

Класс символов — это элемент шаблона, который может соответствовать любому символу из определённого набора символов. Например, класс символов%dсоответствует любой цифре. Таким образом, вы можете использовать строку шаблона%d%d/%d%d/%d%d%d%dдля поискаdd/mm/yyyyдаты в формате:

Пример

s = "Крайний срок — 30/05/1999, окончательный"
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, string.find(s, date)))    --> 30/05/1999

В следующей таблице перечислены все классы символов, поддерживаемые Lua:

Одиночный символ (кроме^$()%.[]*+-?): совпадает с самим символом

  • . (точка): соответствует любому символу
  • %a: соответствует любой букве
  • %c: соответствует любому управляющему символу (например, \n)
  • %d: соответствует любой цифре
  • %l: соответствует любой строчной букве
  • %p: соответствует любому знаку пунктуации
  • %s: соответствует любому пробельному символу
  • %u: соответствует любой прописной букве
  • %w: соответствует любому буквенно-цифровому символу
  • %x: соответствует любой шестнадцатеричной цифре
  • %z: соответствует любому символу, представляющему 0
  • %x (где x — не буквенно-цифровой символ): соответствует символу x. В основном используется для сопоставления символов со специальными функциями в выражениях (^$()%.[]*+-?), например, %% соответствует %
  • [несколько классов символов]: соответствует любому классу символов, содержащемуся в []. Например, [%w_] соответствует любой букве/цифре или символу подчёркивания (_)
  • [^несколько классов символов]: соответствует любому классу символов, не содержащемуся в []. Например, [^%s] соответствует любому непробельному символу

Когда приведённые выше классы символов записаны в верхнем регистре, они соответствуют любому символу, не входящему в этот класс символов. Например, %S соответствует любому непробельному символу. Например, '%A' соответствует небуквенным символам:

> print(string.gsub("hello, up-down!", "%A", "."))
hello..up.down.    4

Число 4 не является частью строкового результата; это второй результат, возвращаемый gsub, представляющий количество выполненных замен.

В сопоставлении с шаблоном есть некоторые специальные символы, имеющие особое значение. Специальные символы в Lua следующие:

( ) . % + - * ? [ ^ $

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

Элементами шаблона могут быть:

  • Один класс символов соответствует любому отдельному символу в этом классе;
  • Один класс символов, за которым следует '*', совпадает с нулём или более символами этого класса. Эта запись всегда совпадает с самой длинной возможной строкой;
  • Один класс символов, за которым следует '+', совпадает с одним или более символами этого класса. Эта запись всегда совпадает с самой длинной возможной строкой;
  • Один класс символов, за которым следует '-', совпадает с нулём или более символами этого класса. В отличие от '*', эта запись всегда совпадает с самой короткой возможной строкой;
  • Один класс символов, за которым следует '?', совпадает с нулём или одним символом этого класса. Если возможно, она совпадёт с одним;
  • %n, гдеnможет быть от 1 до 9; эта запись соответствует подстроке, равнойnнумерованному захвату (описано ниже).
  • %bxy, гдеxиy— два явных символа; эта запись соответствует строке, которая начинается сxи заканчивается наy, и в которойxиyостаётсясбалансированнойстрокой.xПросто+1Это означает, что если читать эту строку слева направо, то каждый раз, когда вы читаетеyПросто-1, и прочитайтеy,yтот, что в самом конце%b().
  • %f[set]может соответствовать выражению со сбалансированными круглыми скобками., относится кшаблону границыset; этот элемент соответствует пустой строке, расположеннойsetперед символом из [set],set.\0имеет то же значение, что описано ранее.

' как если бы.

Шаблон:Шаблон^обозначает последовательность элементов шаблона.$' привязывает совпадение к началу строки.^' привязывает процесс сопоставления к концу строки.$' и '

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

Захваты:Шаблон может заключать подшаблон в круглые скобки;захваты.захваты"(a*(.)%w(%s*))"Подстроки в совпавшей строке сохраняются для дальнейшего использования."a*(.)%w(%s*)",.эта часть сохраняется в первом захвате%s*совпавший символ — это захват 2,

совпавшая часть — это захват 3.()В качестве особого случая пустой захват"()aa()"захватывает текущую позицию в строке (которая является числом)."flaaap"при применении к строке

, он создаст два захвата: