Составление регулярного выражения
От: MASReady  
Дата: 29.07.17 13:36
Оценка:
Доброго времени суток!
Не знал куда написать, написал сюда)

Нужна помощь в составлении регулярного выражения:
нужно найти слово в тексте программы, но не искать в комментариях.
т.е. например есть строка: [код]//[комментарии]
вот нужно, чтобы слово искалось только до начала комментариев, если можно отсечь комментарии помеченные /**/ было бы еще лучше.
регулярные выражения комментарии
Re: Составление регулярного выражения
От: kov_serg Россия  
Дата: 29.07.17 16:06
Оценка:
Здравствуйте, MASReady, Вы писали:

MAS>Доброго времени суток!

MAS>Не знал куда написать, написал сюда)

MAS>Нужна помощь в составлении регулярного выражения:

MAS>нужно найти слово в тексте программы, но не искать в комментариях.
MAS>т.е. например есть строка: [код]//[комментарии]
MAS>вот нужно, чтобы слово искалось только до начала комментариев, если можно отсечь комментарии помеченные /**/ было бы еще лучше.
Для каждой задачи свои инструменты, регулярки тут не пригодны.
Re: Составление регулярного выражения
От: Кодт Россия  
Дата: 31.07.17 09:18
Оценка:
Здравствуйте, MASReady, Вы писали:

MAS>нужно найти слово в тексте программы, но не искать в комментариях.

MAS>т.е. например есть строка: [код]//[комментарии]
MAS>вот нужно, чтобы слово искалось только до начала комментариев, если можно отсечь комментарии помеченные /**/ было бы еще лучше.

От движка регулярок зависит.
Можно попробовать с negative look-behind поиграть
(?<! ( // [^\n]* | ( /\* ( (?! \*/ ) . )* ) ) your_word
====________________________________________=            группа negative look-behind: "предшествует незакрытый комментарий"
     =___________=________________________=              варианты комментариев
       =========                                         // концевой комментарий - не закрыт до конца строки
                   =====================                 /* скобочный комментарий - не закрыт до закрывающей скобки */
       ==            ===                                 признак начала комментария
          =====                                          любой символ, кроме конца строки, тут всё просто
                           =========                     группа negative look-ahead: "закрывающая скобка" (мы её исключаем)
                          ============                   любой символ, кроме закрывающей скобки

Вот как-то так, только надо отлаживать (писал с листа), и не все движки даже в рамках PCRE умеют так делать. А что там с POSIX-движками — вообще плохо представляю.
И это мы ещё не рассмотрели ситуацию, когда якобы-комментарии могут быть внутри кавычек, и когда концевые комментарии оказываются внутри скобочных.

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

Например, для консоли я бы написал простенький скрипт, который чистит код от комментариев, и его выхлоп направил бы на grep. Возможно, что даже направил бы в греп тупо выхлоп сишного препроцессора.
Для скриптуемого редактора написал бы плагин, который ищет в очищенном тексте, сохраняя координаты символов. Причём для саблайма полез бы курить мануалы, а вим с емаксом сразу послал бы нафиг (хотя в них плагин такого рода присобачить должно быть гораздо проще, чем в саблайм). Это религия, тут шуток шутить нельзя.
Для вижуал студии задумался бы о написании плагина на додиезе, заплакал бы и отказался от таких полезных для человечества мыслей. И полез бы в репозиторий готовых плагинов, вдруг кто уже решил эту задачу и съел все конфеты за меня.
Перекуём баги на фичи!
Re[2]: Составление регулярного выражения
От: Кодт Россия  
Дата: 31.07.17 09:19
Оценка:
К>От движка регулярок зависит.
К>Можно попробовать с negative look-behind поиграть

Подробние о look-around — вот на этом, чертовски полезном, ресурсе: http://www.regular-expressions.info/lookaround.html
Перекуём баги на фичи!
Re[2]: Составление регулярного выражения
От: kov_serg Россия  
Дата: 31.07.17 10:01
Оценка:
Здравствуйте, Кодт, Вы писали:

К>... съел все конфеты за меня.

http://www.bdc.cx/software/stripcmt
Re: Составление регулярного выражения
От: goloveshin Россия  
Дата: 31.07.17 14:30
Оценка:
http://txt2re.com/
Re: Составление регулярного выражения
От: AleksandrN Россия  
Дата: 03.08.17 11:26
Оценка:
Здравствуйте, MASReady, Вы писали:

MAS>Доброго времени суток!

MAS>Не знал куда написать, написал сюда)

MAS>Нужна помощь в составлении регулярного выражения:

MAS>нужно найти слово в тексте программы, но не искать в комментариях.
MAS>т.е. например есть строка: [код]//[комментарии]
MAS>вот нужно, чтобы слово искалось только до начала комментариев, если можно отсечь комментарии помеченные /**/ было бы еще лучше.

Используй flex и сделай подобие лексического анализатора, который будет разбирать комментарии и, нужное тебе, слово по отдельности. Каждая лексема там описывается своим регулярным выражением.
Re[2]: Составление регулярного выражения
От: MASReady  
Дата: 04.08.17 21:52
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, MASReady, Вы писали:


MAS>>нужно найти слово в тексте программы, но не искать в комментариях.

MAS>>т.е. например есть строка: [код]//[комментарии]
MAS>>вот нужно, чтобы слово искалось только до начала комментариев, если можно отсечь комментарии помеченные /**/ было бы еще лучше.

К>От движка регулярок зависит.

К>Можно попробовать с negative look-behind поиграть
К>
К>(?<! ( // [^\n]* | ( /\* ( (?! \*/ ) . )* ) ) your_word
К>====________________________________________=            группа negative look-behind: "предшествует незакрытый комментарий"
К>     =___________=________________________=              варианты комментариев
К>       =========                                         // концевой комментарий - не закрыт до конца строки
К>                   =====================                 /* скобочный комментарий - не закрыт до закрывающей скобки */
К>       ==            ===                                 признак начала комментария
К>          =====                                          любой символ, кроме конца строки, тут всё просто
К>                           =========                     группа negative look-ahead: "закрывающая скобка" (мы её исключаем)
К>                          ============                   любой символ, кроме закрывающей скобки
К>

К>Вот как-то так, только надо отлаживать (писал с листа), и не все движки даже в рамках PCRE умеют так делать. А что там с POSIX-движками — вообще плохо представляю.
К>И это мы ещё не рассмотрели ситуацию, когда якобы-комментарии могут быть внутри кавычек, и когда концевые комментарии оказываются внутри скобочных.

К>Поэтому было бы неплохо рассказать сперва, зачем нужно искать слово вне комментариев, в какой среде это надо делать, и какие инструменты для этого есть.


К>Например, для консоли я бы написал простенький скрипт, который чистит код от комментариев, и его выхлоп направил бы на grep. Возможно, что даже направил бы в греп тупо выхлоп сишного препроцессора.

К>Для скриптуемого редактора написал бы плагин, который ищет в очищенном тексте, сохраняя координаты символов. Причём для саблайма полез бы курить мануалы, а вим с емаксом сразу послал бы нафиг (хотя в них плагин такого рода присобачить должно быть гораздо проще, чем в саблайм). Это религия, тут шуток шутить нельзя.
К>Для вижуал студии задумался бы о написании плагина на додиезе, заплакал бы и отказался от таких полезных для человечества мыслей. И полез бы в репозиторий готовых плагинов, вдруг кто уже решил эту задачу и съел все конфеты за меня.

Доброго времени суток, спасибо за подробный пример, на примерах всегда легче разобраться)

Писан код в Eclipse, его движок не схавал, к сожалению, такой код, читаю матчасть пытаюсь построить новый на базе этого и просто новый тоже, но пока безрезультатно)
Re: Составление регулярного выражения
От: MASReady  
Дата: 04.08.17 21:53
Оценка:
Спасибо всем за помощь, изучаю ссылки и советы, пока результата не достиг(
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.