С Новым годом! Форум программистов, компьютерный форум, киберфорум
Lua
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
2 / 2 / 0
Регистрация: 06.07.2020
Сообщений: 12

Паттерн

13.04.2022, 19:46. Показов 1417. Ответов 9
Метки lua (Все метки)

Студворк — интернет-сервис помощи студентам
Привет

Есть строка
[data][crc]
Пытаюсь достать из нее
data
crc
вот так
Lua
1
2
3
for word in data:gmatch("%[(%a+)%]") do
   print(word) 
end
Выводит crc

Так же есть строка
text_1 text_2
Нужно просто разделить по символу %s (пробел)

Заранее спасибо.

Добавлено через 13 минут
По первому вопросу отбой... у меня был символ "_" в искомой строке

Добавлено через 6 минут
И все таки, а если в DATA будут всевозможные символы _ ; ~!@#$%^&*() то паттерн не сработает. Как быть?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.04.2022, 19:46
Ответы с готовыми решениями:

Паттерн матчинг и поля с метками
Нигде не нашёл как сделать это Вот пример моих попыток это сделать data Tree a = Empty |Tree {node :: a, left :: Tree a,...

Паттерн матчинг, как выкрутиться
Добрый день Есть у меня вот такой код в проекте: --доступные команды станка data Command = G0 Params | G1 Params | F...

Результат функции, как паттерн в регулярном выражении
Добрый! есть некий результат вывода функции &some_sub. вот так не получается. my @array = grep /&some_sub/, LIST; а вот...

9
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
13.04.2022, 19:58
Лучший ответ Сообщение было отмечено maddogmaycry как решение

Решение

Lua
1
2
3
4
5
s = "hello world from Lua Здравствуйте люди"
 
for w in string.gmatch(s, "%S+") do
    print( w )
end
Добавлено через 7 минут
Lua
1
2
3
4
5
s = "[data][crc][!@#$%^&*]"
 
for w in string.gmatch(s, "%[(.-)%]") do
    print( w )
end
1
2 / 2 / 0
Регистрация: 06.07.2020
Сообщений: 12
13.04.2022, 21:28  [ТС]
@vantfiles

Благодарю!

Добавлено через 1 час 22 минуты
Можно еще в догонку
Lua
1
2
3
4
5
local words = {}
test = "text and one more text"
words[1], words[2] = test:match("(%S+)(.+)")
print(words[1])
print(words[2])
Вывод:
Code
1
2
text
 and one more text
Пробел перед словом and. Какой паттерн требуется в данном случае что бы пробел не появлялся?
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
13.04.2022, 21:40
Лучший ответ Сообщение было отмечено maddogmaycry как решение

Решение

Lua
1
2
3
4
5
local words = {}
test = "text and one more text"
words[1], words[2] = test:match("(%S+)%s+(.+)")
print(words[1])
print(words[2])
1
2 / 2 / 0
Регистрация: 06.07.2020
Сообщений: 12
13.04.2022, 21:42  [ТС]
Спасибо!

LUA конечно после "C" одно удовольствие
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
13.04.2022, 21:44
Цитата Сообщение от maddogmaycry Посмотреть сообщение
одно удовольствие
согласен
0
2 / 2 / 0
Регистрация: 06.07.2020
Сообщений: 12
26.06.2022, 00:33  [ТС]
Извините что сюда, походу вы тут самый большой эксперт по LUA.
Мне необходимо результат этой функции
Lua
1
crc = crypto.crc32(str,string.len(str))
поместить в 4 байта (32 bit).

На СИ это делается следующим способом
C
1
2
3
4
5
6
uint32_t crc = 611360292
unsigned char buf[4];
buf[0] = crc >> 24;
buf[1] = crc >> 16;
buf[2] = crc >> 8;
buf[3] = crc;
Добавлено через 4 часа 22 минуты
Простыми словами как 1936580908 разложить на 4*8bit.

Добавлено через 2 часа 27 минут
Не уверен что вариант но работает
Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
local function toBytes(res)
    b = {}
    b[1] = math.floor(res / 2^24)
    b[2] = math.floor((res % 2^24) / 2^16)
    b[3] = math.floor((res % 2^16) / 2^8)
    b[4] = res % 2^8
    for i=1,4 do
        if b[i]<0 then
            b[i] = 256 + b[i]
        end
        b[i] = string.char(b[i])
    end
    return b[1]..b[2]..b[3]..b[4]
end
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
26.06.2022, 10:50
Цитата Сообщение от maddogmaycry Посмотреть сообщение
Не уверен что вариант но работает
Какой версией Lua пользуетесь?
0
2 / 2 / 0
Регистрация: 06.07.2020
Сообщений: 12
27.06.2022, 23:10  [ТС]
Цитата Сообщение от vantfiles Посмотреть сообщение
Какой версией Lua пользуетесь?
Что то вроде 5.1 но возможно она какая то урезанная по библиотекам так как
это LUA для nbiot. На пример не работает конструкция типа
Lua
1
string.pack(">I2", uint):byte(1, -1);
Работает string.format и pack.pack/unpack

Тот вариант что я привел достаточно медленный.
0
54 / 32 / 3
Регистрация: 25.07.2022
Сообщений: 212
25.07.2022, 21:38
maddogmaycry,
Извините что сюда, походу вы тут самый большой эксперт по LUA.
Мне необходимо результат этой функции
Lua
1
crc = crypto.crc32(str,string.len(str))
поместить в 4 байта (32 bit).
Тот код который вы используете не самое лучшее решение.

Вот код который для любого 32-х битного числа максимально быстро выводит байты, вывод массивом их 4-х байтов (чисел от 0 до 255).
Для числа 611360292 результатом будет: 36 112 158 36.
Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
--create lookup table for octal to binary
oct2bin = {
  ['0'] = '000',
  ['1'] = '001',
  ['2'] = '010',
  ['3'] = '011',
  ['4'] = '100',
  ['5'] = '101',
  ['6'] = '110',
  ['7'] = '111'
}
 
local function oct_to_bin(a) return oct2bin[a] end
local function dec_to_bin(n)
  local s = string.format('%o', n)
  s = s:gsub('.', oct_to_bin)
  s = string.format("%032s", s)
  return s
end
 
local function bin_to_bytes(bin)
  local bytes = {}
  for i= 1, #bin, 8 do
    local byte = tonumber(string.sub(bin, i, i+7), 2)
    table.insert(bytes, byte)
  end
  return bytes
end
 
local function dec32_to_bytes(dec)
  local bin = dec_to_bin(611360292)
  local bytes = bin_to_bytes(bin)
  return bytes
end
 
local bytes = dec32_to_bytes(611360292)
print(table.concat(bytes, " "))
Код использует встроенную возможность перевода любого десятичного числа в OCT (восьмеричную систему счисления), под капотом, то есть максимально быстро, а не самостоятельные велосипеды с делением и т.д.
Потом код переводит восьмеричную число в 32-х битную с ведущими нулями. То есть в любом случае получается 32-х битное число (строка). Потом уже разбивка на байты по 8 бит и вывод. PS: Не нужно строить свои велосипеды с делением и т.д.

Добавлено через 2 минуты
PS: используя встроенные функции в Lua (под капотом), не нужно делать свои велосипеды на самом Lua, то есть Lua написан на Си или типа того и все эти переводы систем счислений будут проведены где-то там (где шустро), а не в самом Lua посредством Lua. Здесь только работа со строками (быстрая) :3.

Попытка делать переводы систем счисления над капотом (велосипеды), это все равно, что написать math.floor, math.ceil и т.д. с нуля на самом Lua (в любом случае будет в разы медленнее функций под капотом на Си).

Добавлено через 4 минуты
PS: Если вам нужно будет использовать код для более длинных комбинаций, в 17-ой строки поменять фиксированную длину с 32 на другое значение: 64 и т.д.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.07.2022, 21:38
Помогаю со студенческими работами здесь

Возврат сложных структур из функции - паттерн матчинг
Несколько раз сталкивался с необходимостью написать функцию, которая возвращает много значений (пар, троек, все это объединено в список),...

Надо составить паттерн для нахождения в строке одинарных кавычек, НЕ находящихся внутри английских слов
знаю, как осуществить &quot;заглядывание вперёд&quot;, знаю, как &quot;смотреть назад&quot;, затруднение в том, чтобы это совместить

Почему паттерн абстрактная фабрика - паттерн уровня объектов, если в нём могут быть статические отношения?
Взято из Шевчук А., Охрименко Д., Касьянов А. Design Patterns via C#. Приемы объектно-ориентированного проектирования (2015): Почему...

паттерн(ы)
1.Назовите паттерн(ы) для организации архитектуры программы позволяющий отделить логику, данные и разметку

паттерн
^{2,1000}$ я не понимаю почему это регулярное выражение пропускает только латинские буквы и некоторые указанные спецсимволы, с русским...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru