English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Строки Lua

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

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

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

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

  • [[ и ]] Строка из нескольких символов.

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

string1 = "Lua"
print("\"Строка 1 является\", string1)
string2 = 'oldtoolbag.com'
print("Строка 2 является", string2)
string3 = [["Lua教程"]]
print("Строка 3 является", string3)

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

"Строка 1 является" Lua
Строка 2 является oldtoolbag.com
Строка 3 является "Lua教程"

Символы逃逸 используются для представления символов, которые нельзя напрямую отображать, например, клавишу отступа, клавишу Enter и т.д. Например, в строке можно использовать двойные кавычки как "\"".

Все символы逃逸 и их значения:

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

Операції зі string

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, [end]])
Пошук вказаного вмісту в визначеному цільовому рядку (третій параметр - індекс), повертає його конкретне положення. Якщо не знайдено, повертає nil.
> 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) і 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
> string.rep("abcd",2)
abcdabcd
10..
Связывание двух строк
> print("www.w3codebox.".."com")
ru.oldtoolbag.com
11string.gmatch(str, pattern)
Возвращает функцию итератора, которая возвращает следующий подстроку, соответствующую шаблону pattern. Если шаблон 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--w3codeboxgoogletaobao--suffix"
print("\nИсходная строка", string.format("%q", sourcestr))
-- Вырезать часть, с первого по пятнадцатый символ
local first_sub = string.sub(sourcestr, 4, 15)
print("\nПервый разреженный отрезок:", string.format("%q", first_sub))
-- Вырезать префикс строки, с первого по восьмой символ
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--w3codeboxgoogletaobao--suffix"
Первый разреженный отрезок: "fix--w3codeboxg"
Второй разреженный отрезок: "prefix--"
Третий разреженный отрезок: "ao--suffix"
Четвертый разреженный отрезок: "prefix--w3codeboxgoogletaobao--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("Новая строка:", reversedString)

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

5 12
Новая строка: lairotuT auL

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

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

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

Ниже приведены примеры того, как можно форматировать строки:

Форматная строка может содержать следующие escape-символы:

  • %c - принимает число и преобразует его в символ, соответствующий ASCII-таблице

  • %d, %i - принимает число и преобразует его в формат знакового целого числа

  • %o - принимает число и преобразует его в формат восьмеричной системы счисления

  • 袘ринимает число и преобразует его в формат беззнакового целого числа

  • %x - принимает число и преобразует его в формат шестнадцатеричной системы счисления с маленькой буквой

  • %X - принимает число и преобразует его в формат шестнадцатеричной системы счисления с большой буквой

  • %e - принимает число и преобразует его в формат научной ноты с маленькой буквой e

  • %E - принимает число и преобразует его в формат научной ноты с большой буквой E

  • %f - принимает число и преобразует его в формат с плавающей запятой

  • %g(%G) - принимает число и преобразует его в более короткий формат из %e(%E, соответствующий %G) и %f

  • %q - принимает строку и преобразует её в формат, безопасный для компилятора Lua

  • %s - принимает строку и форматирует её по заданным параметрам

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

  • (1) Символ: один '+' означает, что следующий escape-символ будет отображать положительные числа с знаком. По умолчанию только отрицательные числа отображаются с знаком.

  • (2) Замещающий символ: один '0', который используется в качестве замещающего символа при указании ширины строки. По умолчанию используемый замещающий символ - пробел.

  • (3) Идентификатор выравнивания: по умолчанию правое выравнивание при указании ширины строки, добавление '-' может изменить его на левое выравнивание.

  • (4) Значение ширины

  • (5) Количество знаков после запятой/обрезание строки: дополнительная часть n после значения ширины, если за ней следует f (escape-символ для чисел с плавающей запятой, например %6.3f), то устанавливается, что дробная часть числа сохраняется только n знаков, если за ней следует s (escape-символ для строк, например %5.3s), то устанавливается, что строка отображается только первые n знаков.

string1 = "Lua"
string2 = "Tutorial"
number1 = 10
number2 = 20
-- Основной форматировщик строк
print(string.format("Основной форматировщик %s %s", string1, string2))
-- Форматирование даты
date = 2; month = 1; year = 2014
print(string.format("Форматирование даты %02d/%02d/%03d", date, month, year))
-- Десятичное форматирование
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("眻, 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 = "w3codebox"
string3 = ".com"
-- Соединение строк с помощью ..
print("Соединение строк", string1..string2..string3)
-- Длина строки
print("Длина строки", string.len(string2))
-- Копирование строки 2 раза
repeatedString = string.rep(string2, 2)
print(repeatedString)

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

Соединение строк         ru.oldtoolbag.com
Длина строки           5
w3codeboxw3codebox

Модели соответствия

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

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

Класс символов - это элемент шаблона, который может соответствовать любому символу в заданном наборе символов. Например, класс символов %d Соответствует любому числовому значению. Поэтому вы можете использовать шаблон %d%d/%d%d/%d%d%d%d для поиска dd/mm/yyyy Формат даты:

s = "Deadline is 30/05/1999, firm"
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: Соответствует пробельному символу.

  • 宧ответствует любому заглавному символу.

  • %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 таковы:

( ) . % + - * ? [ ^ $

'%' используется в качестве символаEscape для специальных символов, поэтому '%.' соответствует точке; '%%' соответствует символу '%'. СимволEscape '%' может использоваться не только для escaping специальных символов, но и для всех неалфавитных символов.

Элемент шаблона может быть:

  • один символ класса соответствует любому одному символу этого класса;

  • один символ класса за '*', Соответствует нулю или нескольким символам этого класса. Этот элемент всегда соответствует как можно более длинной строке;

  • один символ класса за '+', Соответствует одному или нескольким символам этого класса. Этот элемент всегда соответствует как можно более длинной строке;

  • один символ класса за '-', Соответствует нулю или нескольким символам этого класса. В отличие от '*', Этот элемент всегда соответствует как можно более короткой строке;

  • один символ класса за '?', Соответствует нулю или одному символу этого класса. Если возможно, он будет соответствовать одному;

  • %n, Здесь n от 1 до 9; Этот элемент соответствует равенству n подстрока, которая будет описана позже.

  • %bxy, Здесь x и y Это два ясных символа; Эта запись совпадает с x начинается y оканчивается и в котором x и y сохраняется Баланс в этой строке. означает, что если читать эту строку слева направо, на каждое чтениеx это +1 и, читая слева направо, каждый раз, когда читается y это -1, в конечной точке этой y является первой, которая достигает 0 y. Например, запись %b() может совпасть с балансированным выражением в скобках.

  • %f[set] Это Граничные шаблоны; Эта запись будет совпадать с положением set внутри某个 символа перед этим и этот символ не принадлежит set . Множество set Значение, как указано выше. Расчет начала и конца совпадения пустой строки, найденной в совпадении, можно рассматривать как наличие символа в этом месте. '\0' также.

Шаблон:

Шаблон Это последовательность шаблонов. Добавление символа '^' в начале шаблона привяжет процесс совпадения к началу строки. Добавление символа '$' в конец шаблона会使 процесс совпадения привязан к концу строки. Если '^' и '$' появляются в других местах, они не имеют особого значения, они просто представляют себя.

Уловка:

Шаблон может быть использован для внутреннего включения подшаблона в kleine скобки; Эти подшаблоны называются Уловленные объекты. При успешном совпадении, они определяются Уловленные объекты Подстроки, соответствующие уловленным строкам, сохраняются для будущего использования. Уловленные объекты нумеруются в порядке их левого скобки. Например, для шаблона "(a*(.)%w(%s*))", Часть строки, соответствующая "a*(.)%w(%s*)", сохраняется в первом уловленном объекте (тем самым номером 1); Символы, соответствующие ".", являются вторым уловленным объектом, Часть, соответствующая "%s*", является третьим уловленным объектом.

Как исключение, пустые уловленные скобки () уловят текущее положение строки (это число). Например, если приложить шаблон "()aa()" к строке "flaaap", будет получено два уловленных объекта: 3 и 5.