Страница: 1 | 2 |
Как написать функцию, удаляющую комментарии (VB'шные) из текста? Помогите, запарился уже...
Я знаю, это очень просто... Но меня в последнее время очень глючит как и мой инет... Дык смотрим всю строку, на наличие 1-го символа " ' ", а по нахождении - удаляем всю строку, а если разбить предусмотрительно весь текст на массив по vbCrLf, то попросту эту строку не обрабатывать и все... 2sne: забыл еще про многострочные комментарии (которые через знак подчеркивания), про апострофы в строках, про REM (да, есть и такие, которые используют rem!) Хм... действительно... а я считал что знак " _" работает только в отношении кода... а он еще и комменты могет переносить... А можно функцией? Так, именно таковую и надо написать, которая бы "просматривала" весь текст на наличие в начале строки (разкмеется не считая пробелов) либо " ' ", либо "Rem", далее просматривала окончание строки, и в зависимости от имеющегося там 2-х символов " _", принимала решение удалять-ли следующую... Позволю себе повредничать Во-первых, просматривать на наличие апострофа надо не начало строки, не считая пробелов, а всю строку, так как ничто не мешает ему находиться в середине строки (про rem не помню), во-вторых, обязательно надо иметь переменную, считающую вложенность в кавычки вне комментариев, так как ничто не мешает находиться апострофу в строках. удаляй всё что правее символа ' , используя конструкцию типа right(str,len(str)-1)...конструкции как написано выше редкость...можно и ручками подправить чёнить либо смотреть на незакрытый "... Во блин... Просишь о помощи, а они еще больше грузят... Так что слабо написать эту функцию, а? Держи, от сердца отрываю. Только с одним условием. Найдёшь ошибку - с тебя пример. === Это для PB. Сам переделай. Там несложно. --- Function Editor_GetLineText Alias "Editor_GetLineText"(ByVal LineNumber As Long) Export As String Dim LineText As String LineText=edmTxtGetLine(ghEdit, LineNumber) Dim DQ1 As Integer, DQ2 As Integer, REM1 As Integer Dim SearchMore As Integer:SearchMore=%TRUE While IsTrue(SearchMore) DQ1=InStr(DQ2+1,LineText,Chr$(34)) If DQ1>0 Then DQ2=InStr(DQ1+1,LineText,Chr$(34)) End If REM1=InStr(-1,UCase$(LineText),"REM") If REM1=0 Then REM1=InStr(-1,LineText,"'") If REM1>DQ1 And REM1 If DQ1=0 Or DQ2=0 Then SearchMore=%FALSE Wend If REM1>0 Then LineText=Left$(LineText,REM1-1) Function=LineText End Function Мало того что форум тормознутый, так он ещё и глюкавый. >If REM1>DQ1 And REM1 Должно быть так: If REM1>DQ1 And REM1 Но почему то обрезалось. === Вместо "instr(-1," используй instrrev. IsTrue думаю сам допрёшь. Если это надо делать НЕ ПРОГРАММНО, то сгодятся продукты типа CodeSmart от AXTools. Вообще это полезная штука для разработчика. Comanche, дак я хочу убирать комменты не в VB, а в строках моего приложения... А CodeSmart у меня стоит.
Вопрос: Удаление комментарий
Добавлено: 21.03.04 20:40
Автор вопроса: Александр | ICQ: 204034
Ответы
Всего ответов: 17
Номер ответа: 1
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #1
Добавлено: 21.03.04 20:49
Номер ответа: 2
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #2
Добавлено: 21.03.04 22:51
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 21.03.04 22:58
Номер ответа: 4
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #4
Добавлено: 21.03.04 23:07
Ну да... помню еще те времена, когда Rem писал в своих прогах Но это было действительно оччень давно
Номер ответа: 5
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #5
Добавлено: 22.03.04 07:46
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 22.03.04 10:59
На мой взгляд при таком раскладе, проще всего разбить весь текст на строки и поместить их в массив (Split())...
Номер ответа: 7
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #7
Добавлено: 22.03.04 17:28
Номер ответа: 8
Автор ответа:
2San
Вопросов: 11
Ответов: 68
Профиль | | #8
Добавлено: 22.03.04 21:53
А если апостроф в кавычках? Например: MsgBox "Наличие 'МК44-м3' не
предусмотренно!"
Вообще гемор!!!
> Origin: Легко работать как лошадь, трудно как японец
Номер ответа: 9
Автор ответа:
Clubber
Вопросов: 1
Ответов: 18
Профиль | | #9
Добавлено: 22.03.04 23:06
Номер ответа: 10
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #10
Добавлено: 23.03.04 06:46
Номер ответа: 11
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #11
Добавлено: 23.03.04 08:32
Ну кому хочется делать чужую работу? Особенно в России...
Функция действительно сложновата получится...
> во-вторых, обязательно надо иметь переменную, считающую вложенность в кавычки вне комментариев
ИМХО, тут достаточно Boolean... Находим двойную кавычку - переключаем
флаг.. Находим одинарную - если флаг=True, то отрезаем всё до конца
строки, если False, идём дальше.
Насчёт "_" - если нашли комментарий, но он заканчивается на "_", то
просто тащимся дальше до тех пор, пока не встретим строчку, в конце
которой нет "_".
А вот кто подскажет, как это с помощью регулярных выражений сделать?
Номер ответа: 12
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #12
Добавлено: 27.03.04 19:47
Номер ответа: 13
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #13
Добавлено: 27.03.04 20:07
Номер ответа: 14
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #14
Добавлено: 27.03.04 20:54
Номер ответа: 15
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #15
Добавлено: 28.03.04 09:48