Доброго времени суток!
Не знал куда написать, написал сюда)
Нужна помощь в составлении регулярного выражения:
нужно найти слово в тексте программы, но не искать в комментариях.
т.е. например есть строка: [код]//[комментарии]
вот нужно, чтобы слово искалось только до начала комментариев, если можно отсечь комментарии помеченные /**/ было бы еще лучше.
Здравствуйте, MASReady, Вы писали:
MAS>Доброго времени суток! MAS>Не знал куда написать, написал сюда)
MAS>Нужна помощь в составлении регулярного выражения: MAS>нужно найти слово в тексте программы, но не искать в комментариях. MAS>т.е. например есть строка: [код]//[комментарии] MAS>вот нужно, чтобы слово искалось только до начала комментариев, если можно отсечь комментарии помеченные /**/ было бы еще лучше.
Для каждой задачи свои инструменты, регулярки тут не пригодны.
Здравствуйте, MASReady, Вы писали:
MAS>нужно найти слово в тексте программы, но не искать в комментариях. MAS>т.е. например есть строка: [код]//[комментарии] MAS>вот нужно, чтобы слово искалось только до начала комментариев, если можно отсечь комментарии помеченные /**/ было бы еще лучше.
От движка регулярок зависит.
Можно попробовать с negative look-behind поиграть
(?<! ( // [^\n]* | ( /\* ( (?! \*/ ) . )* ) ) your_word
====________________________________________= группа negative look-behind: "предшествует незакрытый комментарий"
=___________=________________________= варианты комментариев
========= // концевой комментарий - не закрыт до конца строки
===================== /* скобочный комментарий - не закрыт до закрывающей скобки */
== === признак начала комментария
===== любой символ, кроме конца строки, тут всё просто
========= группа negative look-ahead: "закрывающая скобка" (мы её исключаем)
============ любой символ, кроме закрывающей скобки
Вот как-то так, только надо отлаживать (писал с листа), и не все движки даже в рамках PCRE умеют так делать. А что там с POSIX-движками — вообще плохо представляю.
И это мы ещё не рассмотрели ситуацию, когда якобы-комментарии могут быть внутри кавычек, и когда концевые комментарии оказываются внутри скобочных.
Поэтому было бы неплохо рассказать сперва, зачем нужно искать слово вне комментариев, в какой среде это надо делать, и какие инструменты для этого есть.
Например, для консоли я бы написал простенький скрипт, который чистит код от комментариев, и его выхлоп направил бы на grep. Возможно, что даже направил бы в греп тупо выхлоп сишного препроцессора.
Для скриптуемого редактора написал бы плагин, который ищет в очищенном тексте, сохраняя координаты символов. Причём для саблайма полез бы курить мануалы, а вим с емаксом сразу послал бы нафиг (хотя в них плагин такого рода присобачить должно быть гораздо проще, чем в саблайм). Это религия, тут шуток шутить нельзя.
Для вижуал студии задумался бы о написании плагина на додиезе, заплакал бы и отказался от таких полезных для человечества мыслей. И полез бы в репозиторий готовых плагинов, вдруг кто уже решил эту задачу и съел все конфеты за меня.
Здравствуйте, MASReady, Вы писали:
MAS>Доброго времени суток! MAS>Не знал куда написать, написал сюда)
MAS>Нужна помощь в составлении регулярного выражения: MAS>нужно найти слово в тексте программы, но не искать в комментариях. MAS>т.е. например есть строка: [код]//[комментарии] MAS>вот нужно, чтобы слово искалось только до начала комментариев, если можно отсечь комментарии помеченные /**/ было бы еще лучше.
Используй flex и сделай подобие лексического анализатора, который будет разбирать комментарии и, нужное тебе, слово по отдельности. Каждая лексема там описывается своим регулярным выражением.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, MASReady, Вы писали:
MAS>>нужно найти слово в тексте программы, но не искать в комментариях. MAS>>т.е. например есть строка: [код]//[комментарии] MAS>>вот нужно, чтобы слово искалось только до начала комментариев, если можно отсечь комментарии помеченные /**/ было бы еще лучше.
К>От движка регулярок зависит. К>Можно попробовать с negative look-behind поиграть К>
К>(?<! ( // [^\n]* | ( /\* ( (?! \*/ ) . )* ) ) your_word
К>====________________________________________= группа negative look-behind: "предшествует незакрытый комментарий"
К> =___________=________________________= варианты комментариев
К> ========= // концевой комментарий - не закрыт до конца строки
К> ===================== /* скобочный комментарий - не закрыт до закрывающей скобки */
К> == === признак начала комментария
К> ===== любой символ, кроме конца строки, тут всё просто
К> ========= группа negative look-ahead: "закрывающая скобка" (мы её исключаем)
К> ============ любой символ, кроме закрывающей скобки
К>
К>Вот как-то так, только надо отлаживать (писал с листа), и не все движки даже в рамках PCRE умеют так делать. А что там с POSIX-движками — вообще плохо представляю. К>И это мы ещё не рассмотрели ситуацию, когда якобы-комментарии могут быть внутри кавычек, и когда концевые комментарии оказываются внутри скобочных.
К>Поэтому было бы неплохо рассказать сперва, зачем нужно искать слово вне комментариев, в какой среде это надо делать, и какие инструменты для этого есть.
К>Например, для консоли я бы написал простенький скрипт, который чистит код от комментариев, и его выхлоп направил бы на grep. Возможно, что даже направил бы в греп тупо выхлоп сишного препроцессора. К>Для скриптуемого редактора написал бы плагин, который ищет в очищенном тексте, сохраняя координаты символов. Причём для саблайма полез бы курить мануалы, а вим с емаксом сразу послал бы нафиг (хотя в них плагин такого рода присобачить должно быть гораздо проще, чем в саблайм). Это религия, тут шуток шутить нельзя. К>Для вижуал студии задумался бы о написании плагина на додиезе, заплакал бы и отказался от таких полезных для человечества мыслей. И полез бы в репозиторий готовых плагинов, вдруг кто уже решил эту задачу и съел все конфеты за меня.
Доброго времени суток, спасибо за подробный пример, на примерах всегда легче разобраться)
Писан код в Eclipse, его движок не схавал, к сожалению, такой код, читаю матчасть пытаюсь построить новый на базе этого и просто новый тоже, но пока безрезультатно)