Поиск комментариев в коде. Регулярные выражения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Поиск комментариев в коде. Регулярные выражения

Сообщение viter.alex » 17.07.2009 (Пт) 9:39

Анализирую код VB с помощью RegExp. Не могу правильно обработать многострочные комментарии.
Однострочный ищется просто:
Код: Выделить всё
  With oRegExp
    .IgnoreCase = True
    .MultiLine = True
    .Pattern = "('.*?\n)"
    txtCode.Text = .Replace(txtCode.Text, sGreen1 & "$1" & sGreen2)
  End With

А как найти многострочный комментарий? Который разделен на строки через символ подчеркивания?
Лучше день потерять — потом за пять минут долететь!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Хакер » 17.07.2009 (Пт) 9:41

Я думаю (а фанаты регэкспов не думают), что ты замучаешься. Меняй подход.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение viter.alex » 17.07.2009 (Пт) 9:58

Хотя бы наводку дай в каком направлении менять подход.
Лучше день потерять — потом за пять минут долететь!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Хакер » 17.07.2009 (Пт) 10:01

Опиши задачу.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение alibek » 17.07.2009 (Пт) 10:04

Многострочные комментарии в VB6?
Lasciate ogni speranza, voi ch'entrate.

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение viter.alex » 17.07.2009 (Пт) 10:12

Задача такая: в коде VB6 нужно обрамить ключевые слова тегами [сolor="blue"][/color]. Это я сделал.
И комментарии тегами [сolor="green"][/color]. Сделал только для однострочных комментариев.
Лучше день потерять — потом за пять минут долететь!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Хакер » 17.07.2009 (Пт) 10:58

Если задача сделать подсветку синтаксиса (правильную подсветку), то регулярные выражения однозначно не годятся.

Подход: парсить код самому.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение viter.alex » 17.07.2009 (Пт) 11:03

Нет, мне не нужна подсветка. Я делаю только для себя, чтобы можно было вставлять подсвеченый код на форум, где подсветки синтаксиса нет, но можно использовать теги цвета bbcode внутри тега [сode][/сode].
Лучше день потерять — потом за пять минут долететь!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Хакер » 17.07.2009 (Пт) 11:14

Я под подсветкой имел в виду не саму по себе отрисовку кода разными цветами, а определение тех мест кода, которые особыми цветами должны быть выделены. Тебе ведь именно это надо. Найти места, где надо вставить [color=xxx] и [/color]?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение viter.alex » 17.07.2009 (Пт) 11:40

Ну, в общем, да. Только как? Будем читать матчасть.
Лучше день потерять — потом за пять минут долететь!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Хакер » 17.07.2009 (Пт) 11:41

Как что? Как поэлементно обрабатывать данные?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение viter.alex » 17.07.2009 (Пт) 11:52

Общий принцип. Что и в какой последовательности делать.
Лучше день потерять — потом за пять минут долететь!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Хакер » 17.07.2009 (Пт) 11:54

Обрабатывать код. Слева направо.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение viter.alex » 17.07.2009 (Пт) 20:42

И все-таки я нашел решение. «Ну не может быть, чтобы его не было», — сказал я себе. Я бы в жизни не додумался до такой строки, но подсказала программа RegexBuddy. Просто роскошная штука для работы с регулярными выражениями.
Итак, вот так это делается:
Код: Выделить всё
    .Pattern = "('[^_\r\n]*+(?:_\r?+\n?+[^_\r\n]*+)*+)"
    txtCode.Text = .Replace(txtCode.Text, "[COLOR=""Green""]$1[/COLOR]")

Работает и для однострочного и для многострочного комментария.

Одно замечание. Не будет работать, если RegExp создавать через CreateObject. Нужно подключить библиотеку Microsoft VBScript Regular Expressions 5.5 и объявлять так:
Код: Выделить всё
Dim oRegExp As RegExp
Set oRegExp = New RegExp


Но это еще не конец, потому что если одинарная кавычка будет использована внутри строки, то это тоже будет считаться комментарием. Будем думать.
Лучше день потерять — потом за пять минут долететь!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Хакер » 17.07.2009 (Пт) 21:50

Ты забыл, что есть ещё Rem. Ты забыл (но вспомнил сейчас), что есть есть строки.
А ещё Comment-like вхождения могут быть в строках. А последовательности, похожие на строки — в комментариях.

Я предполагаю, что ты, как я в самом начале сказал, прежде чем сделаешь правильно работающий подсветчик, измучаешься и пожалеешь, что связался с регулярными выражениями.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение viter.alex » 17.07.2009 (Пт) 22:01

Хакер писал(а):Ты забыл, что есть ещё Rem. …

Я делаю для себя. Rem давно не видел, но тем не менее это не проблема:
"((?:Rem|')[^_\r\n]*(?:_\r?\n?[^_\r\n]*)*)"

Про Comment-like вхождения я думаю, есть наметки.
Еще не пожалел. Наоборот. :D
Последний раз редактировалось viter.alex 18.07.2009 (Сб) 7:43, всего редактировалось 1 раз.
Лучше день потерять — потом за пять минут долететь!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Хакер » 17.07.2009 (Пт) 22:05

viter.alex писал(а):"((?:Rem|')[^_\r\n]*+(?:_\r?+\n?+[^_\r\n]*+)*+)"

Мне кажется Rembo подходит по это выражение. Разве нет?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение viter.alex » 17.07.2009 (Пт) 22:27

Спасибо за подсказку.
((?:\bRem\b|')[^_\r\n]*(?:_\r?\n?+^_\r\n]*)*)
Последний раз редактировалось viter.alex 18.07.2009 (Сб) 7:43, всего редактировалось 1 раз.
Лучше день потерять — потом за пять минут долететь!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение alibek » 17.07.2009 (Пт) 22:54

S = " Test: Rem Sample" : Rem "Test Sample"

?
Lasciate ogni speranza, voi ch'entrate.

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение viter.alex » 17.07.2009 (Пт) 23:35

Со вложенными я еще не разобрался.

Предложи свой способ, если таковой имеется
Лучше день потерять — потом за пять минут долететь!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Nord777 » 18.07.2009 (Сб) 10:53

А как найти многострочный комментарий? Который разделен на строки через символ подчеркивания?
А что, разве в VB6 такое прокатывает?

Код: Выделить всё
         'comment line1 _
          comment(line2)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Хакер » 18.07.2009 (Сб) 10:57

Прокатывает конечно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Nord777 » 18.07.2009 (Сб) 16:10

Глянь пойдёт или нет:

( (?<="[^"]+"\s*):*\s+(?<comment>(rem|').*(\s+_\r\n.*)*)) | ((?<!".*):*\s+(?<comment>(rem|').*(\s+_\r\n.*)*) )

опции:
IgnoreCase
RightToLeft
IgnorePatternWhitespace
ExplicitCapture


нужное значение в группе comment
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение viter.alex » 18.07.2009 (Сб) 16:43

Вложенные действительно пропускает, но берет только те комментарии, где перед одинарной кавычкой стоит пробел.

Это ты в .Net делал? VB6 не берет lookbehind :(
Лучше день потерять — потом за пять минут долететь!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Nord777 » 18.07.2009 (Сб) 16:50

Вложенные действительно пропускает, но берет только те комментарии, где перед одинарной кавычкой стоит пробел.
Так ведь VB6 автоформатирует так, что перед кавычкой ставится пробел(или нет?).

ну вот без пробелов:
( (?<="[^"]+"\s*):*\s*(?<comment>(rem|').*(\s+_\r\n.*)*)) | ((?<!".*):*\s*(?<comment>(rem|').*(\s+_\r\n.*)*) )

Это ты в .Net делал?
Да
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение viter.alex » 18.07.2009 (Сб) 17:09

Nord777 писал(а):Так ведь VB6 автоформатирует так, что перед кавычкой ставится пробел(или нет?).


А если комментарий начинается с начала строки?

И многострочный не берет
Лучше день потерять — потом за пять минут долететь!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Nord777 » 18.07.2009 (Сб) 17:13

А если комментарий начинается с начала строки?
Да, не сообразил. Последний регексп это понимает.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Nord777 » 18.07.2009 (Сб) 17:15

И многострочный не берет
Покажи строку, которая не распознаётся.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение viter.alex » 18.07.2009 (Сб) 17:29

Код: Выделить всё
  'Многострочный комментарий _
  Многострочный комментарий _
  Многострочный комментарий
Лучше день потерять — потом за пять минут долететь!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Поиск комментариев в коде. Регулярные выражения

Сообщение Nord777 » 18.07.2009 (Сб) 17:33

Если у тебя framework установлен могу скинуть прогу, чтоб потестил(у меня эти строки работают, но может я чего то не понял...)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 21

    TopList