Saphire
В регулярных выражениях, а обычно именно они в таких случаях используются, для "захвата" группы символов используются обычные скобки. ^([a-z]+) на строке "abc123efg" группа \1 будет равна abc.
...и до меня только сейчас доперло, что \0 - всё, что нашли.
Можно тогда было использовать "луч" {80,} - От 80ти символов и до бесконечности*
Snusmumriken
Смотри, вот тут - протестированный живой пример.
А ещё, мне нужны не группы а повторения символов "более 80".
Saphire
Snusmumriken
Я не помнил что есть "лучи", поэтому влепил 100500. Пофигу.
Последний вариант:
найти: (\n[^\n]{80,}\n)
заменить: \n--!!СОКРАТИ БОТВУ, МУДИЛА!!\1
Notepad++ не капчурит в \0 всё что нашли, поэтому нужен капчур. Эх.
Saphire
Или еще лучше, \n error("...") -- \0
Saphire
Snusmumriken
>Или еще лучше, \n error("...") -- \0
Ну это уже издевательство )))
Snusmumriken
В общем, можно накатать "форматирователь", но это уже полноценная программа-парсер, а не три строчки регулярок ))))
И никто кроме тебя этим заниматься не будет. Мне - лень, уже написал тебе детектор "строк больше чем".
Искать конкатенации и разбивать - сам будешь )))
mva
так заказали нефтяники? :)
mva
// вообще, емнип, потому что так было в языке из которого lua развился
mva
SOL, или как-то так
Roman
Roman
Я часто пишу
some_function(
'this is the ' .. beginning ..
'of very ' .. long ..
'пыщь пыщь' .. gsom ..
'string'
)
все читаемо, главное, в такое очень удобно добавлять или убирать, ничего ты не понимаешь в скобках
Snusmumriken
Я часто пишу
some_function(
'this is the ' .. beginning ..
'of very ' .. long ..
'пыщь пыщь' .. gsom ..
'string'
)
все читаемо, главное, в такое очень удобно добавлять или убирать, ничего ты не понимаешь в скобках
Тот факт что ты так пишешь - означает то, что ты не делаешь высокопроизводительную лабуду, не знаешь как работает пул строк, или же - никогда не работал со строками на несколько сотен мегабайт/гигабайт.
Если бы знал, писал бы так:
some_function(table.concat{
'this is the', beginning,
'of very ', long,
'пыщ-пыщ', gsom,
'string'
})
Ничего я не понимаю в скобках, мда )))
Roman
Тот факт что ты так пишешь - означает то, что ты не делаешь высокопроизводительную лабуду, не знаешь как работает пул строк, или же - никогда не работал со строками на несколько сотен мегабайт/гигабайт.
Если бы знал, писал бы так:
some_function(table.concat{
'this is the', beginning,
'of very ', long,
'пыщ-пыщ', gsom,
'string'
})
Ничего я не понимаю в скобках, мда )))
ССЗБ, запили бенчмарк. Я бы сам запилил, но уже поздно и я точно уверен, лол, ну очевидно же! table.concat{} - тут глобальная переменная table достается из кладовки глобальных, из неё берется value по ключу concat, создается таблица, вызывается функция, и все это вместо того чтобы компилятор увидел: ага! да это же конкатенация! склею-ка я строки!
Snusmumriken
Ох, окей : )
Snusmumriken
Ну как бэ.
А ещё, не происходит переполнений.
Ты не перегоняешь кучу бесполезных строк в мусор.
Roman
wtf из реп??
Snusmumriken
И чем больше строк ты конкатенируешь, чем большего объёма - тем больше выгода от table.concat.
Roman
это наглый мухлеж
Roman
на реп не договаривались!
Snusmumriken
rep - функция, увеличивающая объём )))
Могу без него. Прошу заметить, что реп есть и в том и в другом случаях )))
Roman
Я от том писал, что конкотэнируй хоть 100 строк с переменными или без, компилятор должен понимать что происходит и в сотню раз быстрее делать дело, чем с вызовом функций и созданием таблицы, когда компилятор не понимает что происходит
Roman
Но там уловки!
Roman
И вы с ним за одно
Roman
Серьезно?
Roman
"Тот факт что ты так пишешь - означает то, что ты не делаешь высокопроизводительную лабуду, не знаешь как работает пул строк, или же - никогда не работал со строками на несколько сотен мегабайт/гигабайт."
код:
some_function(
'this is the ' .. beginning ..
'of very ' .. long ..
'пыщь пыщь' .. gsom ..
'string'
)
Roman
Ну вот тот код изначальный и код снуса с rep
Roman
две разности
Snusmumriken
Хе, кстати, как ни странно - да, неоднозначно : )
В одних случаях физически быстрее так, в других - иначе.
Но нагрузка на сборщик мусора в любом случае меньше у меня.
Snusmumriken
На ванильной луа - гарантированно быстрее мой варик.
Roman
Есть две ситуации:
1) Конкатенация обыкновенная, 'строка' .. переменная .. 'ещё строка', тут компилятор не тупой, делает все быстро.
2) Надо циклом составить одну большую строку, тут компилятор лажает, ведь в луа строки - не массивы байт, как в си, а уникальные ссылки на них, и все это приправлено магией, и concat приходит на помощь
Snusmumriken
Компилятор есть только у luajit. Иначе - ничего у тебя нет, никто не оптимизирует писульки.
Snusmumriken
Вот где concat показывает себя прям во всей красе.
Snusmumriken
А если увеличить циклы в десять раз, то первый варик прокатит за почти то же время, а без concat - упадёт от переполнения памяти.
Roman
local str = 'this is the ' .. beginning ..
'of very ' .. long ..
'пыщь пыщь' .. gsom ..
'string'
Roman
и все
Roman
неужели так сложно?
Snusmumriken
Ага.
Roman
обернуть в цикл for i = 1, 100500 и вывести время
Roman
concat будет медленнее в сто раз
Snusmumriken
Твой вариант даже быстрее на коротких строках и малых сроках, но засирает оперативку бешено. Потребление памяти я мерять не могу.
А чистить всё равно придётся, и вот на это уйдёт эта "сотня времени", но чуть позже, особенно если ты часто вызываешь.
Snusmumriken
Опа, или могу мерять потребление памяти.
Snusmumriken
Во, вариант с таблицей по времени/памяти и без таблицы. Вывод: буферы лучше делать таблицами. Можно прикинуть что пик потребления памяти во втором варианте - около гигабайта.
Snusmumriken
Но это - совсем уж "буферный" вариант.
Roman
https://pastebin.com/Ss9bNdkm
я это имел в виду
Roman
запусти, у меня луа временно не доступна, тут код concat маньячно-высоконагрузочный, что его не спасет
Roman
start = time() пропустил случайн
Roman
и n забыл
Roman
и там ещё косячок есть у меня
Snusmumriken
Да не, смысл есть. На частых вызовах concat - теряется его преимущество. Хм.
Snusmumriken
Косячки подправил.
Roman
concat(t, i — тут вместо i надо ''
Snusmumriken
Да.
А вот на заполнении буфера - тут всё круто.
Roman
ровно в сто раз!
Snusmumriken
Фил, ну прочитай, закешировано всё.
Плюс у меня luajit, т.е. на кеширование пофиг.
Roman
https://pastebin.com/HbY7JBDM
без ошибок (вроде)
Snusmumriken
Вот чистый вариант. Разница примерно в те же три раза на малых строках в пользу собирания.
Snusmumriken
Хмм.
Roman
но нули после точки думают иначе
Roman
concat(t, '', 1, 7) было чтобы concat зря длину не считал
Roman
да вы серьезно?)) 0.009 меньше 0.02! правда меньше!
Snusmumriken
Для тех кто является плохим калькулятором, есть хороший калькулятор.
Roman
что такое "собирание"?
Roman
в пользу которого
Snusmumriken
Собирание - типа без табличек и table.concat.
Но для буферизации - table.concat в 100500 раз выгоднее.
Snusmumriken
И надо посмотреть на потребление памяти.
Roman
во! без табличек и table.concat быстрее в целых 2.6309.... раз! печенька с полки моя1
Snusmumriken
А, кароч, я всё понял. Пока строки помещаются в стек - всё ок. Когда перестают - становится хуёво.
Roman
а что там с ограничением стека?
Roman
тот, который гиг?
Snusmumriken
Ты знаешь что такое стек?
Он примерно на .5-2мб.
Кеш-память проца.
Roman
а, да, читал об этом
Roman
но не вижу связи
Roman
секусекусеку!)))) в луа все - динамикл-алокейтед! он ведь интерпретируемый язык, и пусть JIT вас не смущает!
Snusmumriken
Кек )))
Я работать ушёл, всё ещё работаю
Snusmumriken
> динамикл-алокейтед
Конечно динамик-аллокейтед. Когда стека не хватает.
Когда хватает - ускоряет процесс использованием его.
Saphire