разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
может сможете мне подсказать, как так вот сделать?
* Есть строчка, строчка это какой-то луа-код
* нужно в строчке найти положения первого "--",
или иными словами, понять где начинается комментарий
* надо учитывать, что именно первого "--", и не относящегося к самому коду.
* т.е., нам не нужен "--" заключенный в кавычки, например:
print(" -- Hello -- Word! --") -- bug! ".. -- WorLd", and not ".. -- WoRD"
тут нужен тот "--", который рядом со словом "bug",
а любой другой - это будет неправильно
Регексп выражение лучше чтобы было на PCRE,
так как код обработки на другом языке, не Луа.
Ну на крайняк, можно и на Луа, а я попробую его переделать для PCRE
* Есть строчка, строчка это какой-то луа-код
* нужно в строчке найти положения первого "--",
или иными словами, понять где начинается комментарий
* надо учитывать, что именно первого "--", и не относящегося к самому коду.
* т.е., нам не нужен "--" заключенный в кавычки, например:
print(" -- Hello -- Word! --") -- bug! ".. -- WorLd", and not ".. -- WoRD"
тут нужен тот "--", который рядом со словом "bug",
а любой другой - это будет неправильно
Регексп выражение лучше чтобы было на PCRE,
так как код обработки на другом языке, не Луа.
Ну на крайняк, можно и на Луа, а я попробую его переделать для PCRE
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
Как-то я извратился, когда делал поиск видимых переменных в LuaComplete Tabbed. Отсекал от анализа комментарий, при этом
P/S язык Harbour - очень логичный и простой в освоении. Легко переводится на другие (пока не используются программные блоки, записанные в строки. Впрочем, в lua это есть -
--
, входящие в строковый литерал, игнорируются. Также у меня есть прога на языке Harbour, удаляющая комментарии. Там, правда, конечным комментом является //
, но это - настраиваемые подробности. Надо? P/S язык Harbour - очень логичный и простой в освоении. Легко переводится на другие (пока не используются программные блоки, записанные в строки. Впрочем, в lua это есть -
loadstring
).разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
ну вроде выглядит как то что надо, довайтеbuniak_a_h wrote: ↑Wed 17 Feb, 2021 13:53 Как-то я извратился, когда делал поиск видимых переменных в LuaComplete Tabbed. Отсекал от анализа комментарий, при этом --, входящие в строковый литерал, игнорируются.
довайте тоже посмотрим как минимумbuniak_a_h wrote: ↑Wed 17 Feb, 2021 13:53 Также у меня есть прога на языке Harbour, удаляющая комментарии. Там, правда, конечным комментом является //, но это - настраиваемые подробности. Надо?
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
P/S.
А ещё а перепутал. Прога - на Pascal-е (Delphi-7). Но это ещё лучше. Настройка на язык - это строки, начиная с 241
Поправочка. К многострочному комментарию (
--[[…]]
) и многострочным литералам это, увы не относитсяДык дал жа! Ссыль указана!
А ещё а перепутал. Прога - на Pascal-е (Delphi-7). Но это ещё лучше. Настройка на язык - это строки, начиная с 241
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
Паскалевская прога, работающая с lua. Удаляет комментарии. На моём файле сработала как из пущи.
В архиве слегка подправленный исходник и результат компиляции P/S. Забыл написать самое главное.
Единственного regex-выражения, решающего эту задачу, нет. Требуется два прохода. Первый - выставляет признаки, что за символ: просто, строковый литерал или комментарий. Причём, проходить последовательно символ за символом, т.к. тип символа контекстно-зависим: зависит от того, то было раньше. При втором проходе ищется начало (и, возможно, конец) комментария и убивать лишнее.
В архиве слегка подправленный исходник и результат компиляции P/S. Забыл написать самое главное.
Единственного regex-выражения, решающего эту задачу, нет. Требуется два прохода. Первый - выставляет признаки, что за символ: просто, строковый литерал или комментарий. Причём, проходить последовательно символ за символом, т.к. тип символа контекстно-зависим: зависит от того, то было раньше. При втором проходе ищется начало (и, возможно, конец) комментария и убивать лишнее.
Last edited by buniak_a_h on Wed 17 Feb, 2021 16:36, edited 2 times in total.
разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
buniak_a_h, интересно это.
мне на первый взгляд показалось что должно решаться просто "взять первый символ [--] не заключенный в кавычки".
но слепить выражение не смог.
допустим, одним выражением нельзя, тогда может быть так?:
1.) Заменить все что внутри кавычек на пробелы (или другую букву)
2.) в том что осталось, найти первый символ "--"
Пока еще не успел посмотреть что вы послали, но уже спасибо!
мне на первый взгляд показалось что должно решаться просто "взять первый символ [--] не заключенный в кавычки".
но слепить выражение не смог.
допустим, одним выражением нельзя, тогда может быть так?:
1.) Заменить все что внутри кавычек на пробелы (или другую букву)
2.) в том что осталось, найти первый символ "--"
Пока еще не успел посмотреть что вы послали, но уже спасибо!
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
citRiks, в lua есть хороший паттерн:
Есть ещё проблема с многострочными литералами - это два.
Можно заменить то, что в кавычках (паттерны
(а) в PCRE нет аналога
(б) в lua-регэкспах нет альтернативы
%b[]
. Означает текст, заключённый в 2 символа. Увы, нет возможности указать двухсимвольные скобки типа (*---*)
, /*---*/
. А тем более 3-х символьные (как в lua): [=[---]=]
. Это - раз.Есть ещё проблема с многострочными литералами - это два.
Можно заменить то, что в кавычках (паттерны
%b'
' или b""
) на пустые строки (предварительно запомнив место и сам литерал), а в оставшемся поискать --
. Затем обрезать и вернуть литералы назад. Но это всё равно не одно рег.выражение. Тем более, что:(а) в PCRE нет аналога
%b
, а просто (['"].*['"])
даст сбой, если внутри литерала с апострофами встретится кавычка.(б) в lua-регэкспах нет альтернативы
aaa|bbb
т.е. уже надо писать ():match(…) or ():match(…)
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
Для простенького случая подойдёт, наверно, такой паттерн:
Будет ли работать при нескольких строковых литералах, я не знаю.
Line:match([[^(.*%b"".-)--]])
Будет ли работать при нескольких строковых литералах, я не знаю.
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
P/S. Вот такие паттерны работают:
Если несколько литералов - работают тоже.
Первый работает только для литералов, заключённых в двойные кавычки.
Второй не будет работать, если внутри литерала с одним типом кавычек имеется символ другой (здесь «кавычками» я называю и апостроф
Line:match([[^(.*%b"".-)%-%-]]), regex.match(Line, [[^(.*['"].*['"].*)--]])
Если несколько литералов - работают тоже.
Первый работает только для литералов, заключённых в двойные кавычки.
Второй не будет работать, если внутри литерала с одним типом кавычек имеется символ другой (здесь «кавычками» я называю и апостроф
'
, и кавычки "
)- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
Я ни фига не понимаю! Запутать мне не удалось. Проверял на литерале:
Хотя нет. Берётся последний
[[ version -- = "1.1--.1'" .. "2--.2.2"; --http://semver.org/lang/ru/ "aaa"]]
Хотя нет. Берётся последний
--
Last edited by buniak_a_h on Wed 17 Feb, 2021 17:37, edited 2 times in total.
разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
buniak_a_h, выглядит интересно, сейчас попробую что получаетсяbuniak_a_h wrote: ↑Wed 17 Feb, 2021 17:23 P/S. Вот такие паттерны работают:
Line:match([[^(.*%b"".-)%-%-]]), regex.match(Line, [[^(.*['"].*['"].*)--]])
Если несколько литералов - работают тоже.
Первый работает только для литералов, заключённых в двойные кавычки.
Второй не будет работать, если внутри литерала с одним типом кавычек имеется символ другой
(здесь «кавычками» я называю и апостроф ', и кавычки ")
я бы подумал, что надо наверное разделить все-таки нейтрализацию кавычек разного типа по отдельности,
чтобы не создавать путаницу из них?
или в итоге все равно работает правильно?
разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
это я не понял, это хорошо или плохо?buniak_a_h wrote: ↑Wed 17 Feb, 2021 17:35 Я ни фига не понимаю! Запутать мне не удалось. Проверял на литерале:
[[ version -- = "1.1--.1'" .. "2--.2.2"; --http://semver.org/lang/ru/ "aaa"]]
Хотя нет. Берётся последний --
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
В приведённом примере обрезается поcitRiks wrote: ↑Wed 17 Feb, 2021 20:05это я не понял, это хорошо или плохо?buniak_a_h wrote: ↑Wed 17 Feb, 2021 17:35 Я ни фига не понимаю! Запутать мне не удалось. Проверял на литерале:
[[ version -- = "1.1--.1'" .. "2--.2.2"; --http://semver.org/lang/ru/ "aaa"]]
Хотя нет. Берётся последний --
2.2";
. А правильно было бы, чтобы осталось только первое слово version
с пробелами. Т.е. оставляются все литералы, даже если они закомментированы. Удаляется только последний комментарий. Я не знаю, хорошо это, или плохо. Что будет, если в исходной строке нет строкового литерала, я не проверял.
Разделить - это было бы правильно, только в regex.match тогда вместо
['"].*['"]
написать '[^']*'
для одиночных кавычек и "[^"]*"
для двойных. Ну и проверять, какой из паттернов "срабатывает" первым, если срабатывают оба. Например, [[ qqqqq 'aaaaa"bbbbb"aaaaa' -- …]] - результат зависит от порядка анализа. А значит, надо то, что до кавычки, тоже заключить в скобки (^(.*)'[^']*'
) для одиночной и соответственно для двойной и сравнивать длины первого соответствияразделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?
buniak_a_h, мдя, получается полный бардак..
может нужно тупа сделать итерацию такую по всем буквам с начала:
* Встречаем кавычку, значит пропускаем все до следующей такой же кавычки выхода, которая будет закрывающей.
* учесть что может быть "escaping", типа как:
Так вроде не должно быть затратно по CPU, так как итерация всего лишь одна
может нужно тупа сделать итерацию такую по всем буквам с начала:
* Встречаем кавычку, значит пропускаем все до следующей такой же кавычки выхода, которая будет закрывающей.
* учесть что может быть "escaping", типа как:
lua:='\''
, или: lua:="\""
Так вроде не должно быть затратно по CPU, так как итерация всего лишь одна