S = "Текст"; string.byte(S, i); -- Возвращает числовой код символа в строке по индексу i -- i (необязательный параметр) - начальный индекс (по умолчанию, 1) S:byte(i); -- Эквивалентно string.byte(S, 1); -- Вернет 210 string.byte(S, 2); -- Вернет 229 string.byte(S, 3); -- Вернет 234 string.byte(S, 4); -- Вернет 241 string.byte(S, 5); -- Вернет 242 |
string.char
string.char(n,...); -- Возвращает символы по числовым кодам, может принимать любое количество кодов через запятую string.char(210); -- Вернет "Т" string.char(210,229,234,241,242); -- Вернет "Текст" |
string.dump
string.dump(func); -- Возвращает двоичное представление функции func |
string.find
-- Ищет вхождение подстроки в строку и возвращает индекс начала вхождения, или nil, если совпадение не найдено S = "Текст"; string.find(S,"екс"); -- Вернет 2 S:find("екс"); -- Эквивалентно -- В строке поиска можно использовать регулярные выражения |
-- Выводит отформатированную строку string.format("quik%scsharp%s", "lua", ".ru"); -- Вернет строку "quikluacsharp.ru" -- Поддерживаемые опции: %a -- Шестнадцатеричное в виде 0xh.hhhhp+d (только С99) %A -- Шестнадцатеричное в виде 0Xh.hhhhP+d (только С99) %c -- Символ по коду %d -- Десятичное целое со знаком %i -- Десятичное целое со знаком %e -- Экспоненциальное представление ('е' на нижнем регистре) %E -- Экспоненциальное представление ('Е' на верхнем регистре) %f -- Десятичное с плавающей точкой %g -- В зависимости от того, какой вывод будет короче, используется %е или %f %G -- В зависимости от того, какой вывод будет короче, используется %Е или %F %o -- Восьмеричное без знака %s -- Строка символов %u -- Десятичное целое без знака %x -- Шестнадцатеричное без знака (буквы на нижнем регистре) %X -- Шестнадцатеричное без знака (буквы на верхнем регистре) %p -- Выводит указатель %n -- Аргумент, соответствующий этому спецификатору, должен быть указателем на целочисленную переменную. Спецификатор позволяет сохранить в этой переменной количество записанных символов (записанных до того места, в котором находится код %n) %% -- Выводит знак % |
string.match
string.match (S, "шаблон", i); -- Ищет первое вхождение "шаблона" в строку S, при нахождении, возвращает совпадение, иначе nil -- i (необязательный параметр) - указывает с какого по счету символа начинать поиск (по-умолчанию, 1) S:match ("шаблон", i); -- Эквивалентно |
string.gmatch
string.gmatch (S, "шаблон"); -- Возвращает итератор, который, при каждом вызове, возвращает следующее вхождение шаблона в S S:gmatch("шаблон"); -- Эквивалентно -- Пример: Str = "Привет, Мир!"; for S in string.gmatch (Str, "р") do -- какой-то код end; -- Данный цикл совершит 2 итерации, каждый раз помещая в переменную S букву "р" |
string.gsub
string.gsub(S, "Шаблон поиска", "Шаблон замены", n); -- Возвращает копию S, в которой все вхождения "Шаблона поиска" заменяются на "Шаблон замены", который может быть строкой, таблицей или функцией, вторым значением возвращает общее количество проведенных подстановок -- в "Шаблоне замены" символ % работает как символ со специальным назначением: любая последовательность в виде %n, где n от 1 до 9, заменяется на n-ную захваченную подстроку -- n (необязательный параметр) - указывает сколько максимум раз можно сделать подстановку S:gsub("Шаблон поиска", "Шаблон замены", n); -- Эквивалентно -- Примеры: string.gsub("Привет, Мир!", "Мир", "Lua"); -- Вернет "Привет, Lua!" string.gsub("Привет, Мир!", "Мир", "%1%1"); -- Вернет "Привет, МирМир!" |
string.len
string.len(S); -- Возвращает длину строки S S:len(); -- Эквивалентно #S; -- Эквивалентно |
string.upper
string.upper(S); -- Возвращает копию строки S, где все буквы в нижнем регистре заменены на буквы в верхнем регистре S:upper(); -- Эквивалентно |
string.lower
string.lower(S); -- Возвращает копию строки S, где все буквы в верхнем регистре заменены на буквы в нижнем регистре S:lower(); -- Эквивалентно |
string.rep
string.rep(S,n); -- Возвращает строку, которая содержит n копий строки S S:rep(n); -- Эквивалентно |
string.reverse
string.reverse(S); -- Возвращает строку, в которой символы строки S расположены в обратном порядке S:reverse(); -- Эквивалентно |
string.sub
string.sub(S, i, j); -- Возвращает подстроку строки S, которая начинается с символа с индексом i и заканчивается символом с индексом j -- j (необязательный параметр) - по-умолчанию, индекс последнего символа S:sub(i,j); -- Эквивалентно |
Поддерживаемые опции регулярных выражений:
. -- Любой символ %a -- Буква (только англ.!) %A -- Любая буква (русская), символ, или цифра, кроме английской буквы %c -- Управляющий символ %d -- Цифра %D -- Любая буква, или символ, кроме цифры %l -- Буква в нижней раскладке (только англ.!) %L -- Любая буква, символ, или цифра, кроме английской буквы в нижней раскладке %p -- Символ пунктуации %P -- Любая буква, символ, или цифра, кроме символа пунктуации %s -- Символ пробел %S -- Любая буква, символ, или цифра, кроме символа пробела %u -- Буква в верхней раскладке (только англ.!) %U -- Любая буква, символ, или цифра, кроме английской буквы в верхней раскладке %w -- Любая буква, или цифра (только англ.!) %W -- Любой символ, или буква (русская), кроме английской буквы, или цифры %x -- Шестнадцатеричное число %X -- Любая буква, или символ, кроме цифры, или английской буквы, используемой в записи шестнадцатеричного числа %z -- Строковые параметры, содержащие символы с кодом 0 |
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!
Доброе утро , не могли бы вы объснить string.match более короче ну и , если не сложно , то с примерами . Спасибо!
Здравствуйте, самый лучший способ чему-то научиться - это практика, создайте тестовый скрипт, пробуйте разные варианты и смотрите как они работают, все просто, от теории пользы мало.
Здравствуйте.
Есть функция tonumber() которая конвертирует текст в десятичное число, при чем можно указать систему счисления до 36. Так вот, если написать:
local num = tonumber("Z", 36); -- num = 35
И вот собственно вопрос, а как обратно преобразовать? Нужно передать 35, а получить текст "Z"
Функция tostring принимает только 1 параметр, не подходит
Функция string.format умеет только с 16 системой работать, как там указать 36 не придумал.
Других вариантов я больше не нашел. Такое ощущение что в LUA только в одну сторону можно так преобразовать из текста в число, используя любую систему счисления, а обратно забыли функцию сделать. Или я плохо ищу и она все же есть?
Здравствуйте, никогда не сталкивался с такой задачей, потому, к сожалению, не знаю что Вам подсказать.
Здравствуйте!
По вашей наводке решил поработать с фалами и строками, кстати спасибо за помощь!!
Простите за возможно глупый вопрос)) мало разбираюсь во всех эти операциях со строками)
Встала дилема:
Допустим имеется строка "TRANS_ID=1" в файле который я уже открыл в скрипте в режиме чтения-записи .
Далее я делаю поиск для вытаскивания ID, проблема такая, мне нужно чтобы поиск находил совпадение TRANS_ID а выводил то что после равно идет сразу после этого значения, даже не представляю как это вообще можно сделать.
Здравствуйте! Самое простое использовать string.find и string.sub, а вообще, можете ознакомиться с такой темой в интернете, как "регулярные выражения", штука сложная, по началу, но мощная, когда разберетесь.
Спасибо! Функция Саб очень даже умная!
А есть ли еще функция вычленяющая только цифры или только латинские буквы из файла?
Вот для этого и нужны регулярные выражения, с которыми работают функции string.match и string.gmatch
есть ли какой нибудь ресурс по этой теме, который вы можете мне посоветовать?
По обучению не знаю даже что посоветовать, сам в разных местах, в разное время что-то брал, сейчас вот этими двумя вещами пользуюсь:
http://www.exlab.net/tools/sheets/regexp.html - шпаргалка
https://regexr.com/ - конструктор выражений, в котором можно сразу посмотреть как отрабатывает регулярное выражение
Так же, в текущей статье есть символы используемые в Lua в рег. выражениях
что то не совсем получается работать с ними:
пишу string.match(line,"%a") куда и как вообще впихивать эти регулярные выражения синтаксически верно, чтобы было в луа, и чтобы он применился на текст под переменной line?
Ну вот смотрите:
Данный код выведет в сообщении английскую букву H, как первую найденную, т.к. %a это любая английская буква, т.е. функция match находит первое соответствие шаблону и возвращает его.
Этот код выведет с сообщении слово Hello, т.к. %a это любая буква англ. алфавита, а + означает 1 и более, т.е. match найдет первые стоящие рядом несколько букв в строке, т.е. первое слово. Про + есть в шпаргалке, на которую я Вам давал ссылку.
Вот так на простых примерах разбирайтесь (играйтесь) с этой технологией и со временем все поймете.
Спасибо большое!
Со всем разобрался!
Всегда пожалуйста
Здравствуйте,
перевожу номер ордера в строку:
OrderNumm= string.format("%u", trans_reply.order_num)
При этом order_num=7.169483341365e+014
Т.е по идее должно вернуться значение 716948334136500, но почему-то возвращается 2328317108...
Перевести получилось с помощью опции %f и дальнейшего обрезания нулей по функции, которую ниже приводили.
Но все равно не ясно почему не переводит так
OrderNumm= string.format("%u", trans_reply.order_num)
и получается 2328317108
А чем Вам не нравится такой вариант ?:
Такой вариант как раз и был, до тех пор пока не пришло значение 7.169483341365e+014, в итоге в строку переводится также и невозможно снять заявку
Это просто ошибка какая-то у Вас была, не бывает таких номеров заявок.
Здравствуйте. У меня появился вопрос по кусочку кода. Вот кусок кода
. . . . . . prefix,linkType,id = string.match(boneName, "^(.+)%-([DD])%-?(%d*)$")
if (linkType == "DD") then
link = self:getLink(links ,prefix) . . . . .
Непонятки возникли в этой части кода "^(.+)%-([DD])%-?(%d*)$" - Что все эти символы означают? Я понимаю что идет поиск совпадения на DD но что все остальное - просто удаляю все, оставляю DD и перестает работать. Есть прtдположение что все символы до DD это защифрованная буква X - Но что именно тут шифр? Спасибо!
Здравствуйте, погуглите про то, что такое "регулярные выражения".
Спасибо! Пошел гуглить. Не разберусь - продолжу эту ветку сообщений )
Погуглил и не много разобрался, остались не понятки в том что означает этот шаблон (.+)% и я верно понял что все шаблоны совпадений заканчиваются процентом % - то есть у меня три шаблона
этот (.+)% - не понял что он делает - нашел точку, нашел + но в концепте что делают не понял
этот (DD) - ищет в тексте две буквы DD
и этот (%d*) - это как я понял разрешение написать любой символ
Тире между записями - ну это как бы просто тире в тексте.
То есть я хочу убрать первое совпадение. Записывается так? "([DD])%-?(%d*)$"
Я, честно говоря, тоже не силен в регулярных выражениях, разбираюсь в них по мере надобности, но, т.к. это надобность появляется редко, то и забывается все быстро, постараюсь объяснить как я понимаю это выражение, но могу ошибиться:
^(.+)%-([DD])%-?(%d*)$
Как-то так.
Огромное спасибо! Так вот по крупицам и собираешь информацию и учишься!
Всегда пожалуйста, я так же учусь.
Хочу отписаться. Все сделал, все получилось. Еще раз спасибо!
Добрый вечер! Как можно удалить у строки возможно присутствующий символ переноса?
Добрый вечер! Если находите при помощи string.find символ переноса, то обрезаете его при помощи string.sub, можно еще регулярными выражениями воспользоваться.
Спасибо!
Всегда пожалуйста!
Здравствуйте!
Есть скрипт, кажется ваш. Данный скрипт нормально работает, если соблюдается такая структура trades.csv : .
Мне очень неудобно каждый раз подгонять формат своих данных из таблицы сделок, чтобы скрипт корректно работал. Подскажите что надо подредактировать в коде, чтобы было возможно использовать такой файл: ? Если я правильно понимаю достаточно внести изменения в блок "заполняем таблицу", где переменным date и time присвоить правильные значения row[ n ]?
по какой-то причине из сообщения пропали описания структуры .csv, Скрипт работает с "ГГГГ-ММ-ДД ЧЧ:ММ:СС";"Тикер";"Лот";"Цена", а мой файл "ГГГГММДД";"ЧЧММСС";"Тикер";"Лот";"Цена;
Здравствуйте! Я первый раз вижу данный скрипт.
Вам нужно вот эти строки:
заменить на:
Вроде бы должно получиться
Спасибо за код! Значит я ошибочно присвоил вам авторство, извините) Попробовал внеси изменения - квик сообщает "\LCHI\LCHI.lua:1: unexpected symbol near 'п'"
Сделайте скрипту кодировку windows-1251, после этого удалите первый символ, если он будет п
Спасибо, помогло! Чтобы изменить кодировку мне пришлось создать новый пустой файл, задать кодировку 1251, вставить код, сохранить. У меня еще есть одна "хотелка", надеюсь это не сложно реализовать.. Хочу добавить в файл .csv еще один столбец, в котором будет храниться код клиента вида: NNNN/NN (22111/00) и выводить его в всплывающую подсказку.
Спасибо, я самостоятельно разобрался с дополнительным столбцом, всё работает!
Не за что 🙂
Если в Notepad++ пишите скрипты, зайдите: Опции - Настройки - Новый документ и установите там синтаксис по умолчанию Lua и кодировку Windows-1251, чтобы в будущем не было таких проблем
Спасибо за совет!
А если я захочу представить дополнительный столбец в виде текста?
code = tonumber(row[6]) данная строка присваивает переменной code числовое значение, если я правильно понимаю.. Как присвоить переменной текст?
code = tonumber(row[6]) заменил на code = row[6], все работает корректно, текст выводится.
Да, потому что row[6] уже текст
"А чем Вам та функция, которую я давал не понравилась?"
Собственно, вот чем:
Если Вам важно все цифры сохранить после запятой, тогда да!
Здравствуйте, Дмитрий.
Подскажите пожалуйста, как убрать лишние нули из строки с числом типа 35.480000
Цель этого действия - уменьшить объем при передаче стакана.
Здравствуйте! Если не ошибаюсь, tonumber(35.480000) должно помочь
При использовании tonumber число "0.000001" выводится как 1e-006, вроде. Это то же нежелательно. Можно, конечно сделать что то типа этого
str="35.480000";
if string.find(str,".") then
for n=string.len(str)-1, 0, -1 do
if string.byte(str, n)~="0" then
string.sub(str, 0, n+1); break;
end;
end;
Но ведь должно быть что то проще...
попробуйте вот такую функцию использовать:
только сначала tonumber
Попытался найти в строке точку - string.find("123.00", ".") - в результате выяснилось, что string.find при поиске точки всегда возвращает 1. Вот такая подлость.
Если искать цифру, например string.find("123.00","3"), то вернет правильно - 3.
Вообще QLua мне не нравится. С++ намного лучше.
А за Ваши ответы спасибо.
Мне тоже lua по началу не понравился, но сейчас я знаю, что я просто не умел его готовить 🙂
В функции string.find можно использовать регулярные выражения для поиска
https://quikluacsharp.ru/qlua-osnovy/funktsii-raboty-so-strokami-v-qlua-lua/
а в регулярных выражениях точка соответствует любому символу, потому и 1 всегда, чтобы найти точку, нужно ее экранировать либо так:
string.find('123.00', '%.')
либо так:
string.find('123.00', '[\.]')
Понял, спасибо. Придется учится готовить 🙂
В результате получилось так:
Может пригодится кому.
Забыл добавить:
А чем Вам та функция, которую я давал не понравилась?
в сообщениях выведутся те же самые результаты, которые Вы написали, если tonumber не нравится, можно сделать функцию, которая может принимать еще и строковые параметры:
а вызывать так: message('35.480000 = '..math.round('35.480000', 2))
пишите ответ, как новый комментарий к статье, или какому-то предыдущему комментарию, т.к. сайтом допускается максимум 10 вложенных комментариев
Здраствуйте, подскажите, как можно вытащить из строки "! Толик где ты" по пробелам? То есть вытащить слово "Толик", "где" и "ты".
Здравствуйте!
Всем привет!
Не понял почему строковые переменные с дефисом вызывают в поиске непонятки (справа закомментировано выводимое сообщение результата).
message(tostring(string.find('25741//MT-MT','MT-MT'))) --nil
message(tostring(string.find('25741//MT-MTll','MT-MT'))) --nil
message(tostring(string.find('25741//MT-MT','MT-'))) --8
message(tostring(string.find('MT-MT','MT-MT'))) --nil
message(tostring(string.find('MT/MT','MT/MT'))) --1
message(tostring(string.find('MT&MT','MT&MT'))) --1
message(tostring(string.find('M-','M-'))) --1
message(tostring(string.find('MT-','MT-'))) --1
message(tostring(string.find('MT-M','MT-M'))) --nil
Дмитрий, успехов в строительстве! ))
Здравствуйте! Попробуйте вот так:
lua воспринимает поисковую фразу как регулярное выражение, а в регулярных выражениях дефис применяется для указания диапазона, чтобы дефис воспринимался именно как дефис, нужно его экранировать, в lua для этого применяется знак %.
За стройку спасибо! Не такой простой задачей это все оказалось 🙂
Спасибо за пояснение.
Для человека не разобравшегося эти регулярные выражения выглядят полной абракадаброй.))
Что касается стройки, то моя на даче никогда не кончается)
Всегда пожалуйста 🙂