Строки в 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)
Примеры строк с использованием вышеуказанных трех способов приведены ниже:
Пример
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 length = string.len(myString)
print(length) -- Вывод 14
В приведённом выше примере строка myString содержит только ASCII-символы, поэтомуstring.lenфункция может точно вернуть длину строки.
Для строк, содержащих китайские символы, используйтеutf8.lenфункцию:
Пример
-- Вычислить длину строки (количество символов)
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 предоставляет множество методов для поддержки операций со строками:
| Порядковый номер | Метод и назначение |
|---|---|
| 1 | string.upper(argument): Преобразует всю строку в прописные буквы. |
| 2 | string.lower(argument): Преобразует всю строку в строчные буквы. |
| 3 | string.gsub(mainString,findString,replaceString,num) Заменяет внутри строки. mainString — строка, над которой выполняется операция, findString — заменяемый символ, replaceString — символ замены, num — количество замен (можно опустить, тогда заменяются все), например:
> string.gsub("aaaa","a","z",3);
zzza 3
|
| 4 | string.find (str, substr, [init, [plain]]) В указанной целевой строке str выполняется поиск указанного содержимого substr. Если найдена совпадающая подстрока, возвращаются начальный и конечный индексы подстроки; если она не существует, возвращается nil. initЗадаёт начальную позицию поиска, по умолчанию 1. Может быть отрицательным числом, указывающим количество символов, отсчитываемых с конца. plainУказывает, использовать ли простой режим, по умолчанию false. true выполняет только простой поиск подстроки, false означает использование сопоставления с шаблоном регулярного выражения. В следующем примере находятся начальный и конечный индексы строки "Lua":
> string.find("Hello Lua user", "Lua", 1)
7 9
|
| 5 | string.reverse(arg) Реверс строки
> string.reverse("Lua")
auL |
| 6 | string.format(...) Возвращает форматированную строку, аналогично printf
> string.format("the value is:%d",4)
the value is:4
|
| 7 | string.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
>
|
| 8 | string.len(arg) Вычисляет длину строки.
string.len("abc")
3
|
| 9 | string.rep(string, n) Возвращает n копий строки
> string.rep("abcd",2)
abcdabcd
|
| 10 | .. Объединяет две строки
> print("www.example.".."com")
www.example.com
|
| 11 | string.gmatch(str, pattern) Возвращает функцию-итератор. Каждый раз, когда эта функция вызывается, она возвращает следующую подстроку, найденную в строке str, которая соответствует описанию шаблона. Если строка, описанная параметром pattern, не найдена, функция-итератор возвращает nil.
> for word in string.gmatch("Hello Lua user", "%a+") do print(word) end
Hello
Lua
user
|
| 12 | string.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"
Преобразование регистра строк
Следующий пример демонстрирует, как преобразовать регистр строк:
Пример
print(string.upper(string1))
print(string.lower(string1))
Результат выполнения приведённого выше кода:
LUA lua
Поиск и обратный порядок строк
Следующий пример демонстрирует, как выполнять операции поиска и обратного порядка над строками:
Пример
-- Поиск строки
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 символов.
Пример
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("%+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
Другие распространённые функции
Следующий пример демонстрирует другие операции со строками, такие как вычисление длины строки, конкатенация строк, повторение строк и т. д.:
Пример
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даты в формате:
Пример
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"при применении к строке