Regex для разработчиков - PullRequest
       24

Regex для разработчиков

4 голосов
/ 10 сентября 2008

Я пытался найти регулярное выражение, чтобы позволить мне искать определенную строку, автоматически пропуская комментарии. У кого-нибудь есть такой RE или он известен? Он даже не должен быть достаточно сложным, чтобы пропускать #if 0 блоки; Я просто хочу пропустить блоки // и /*. Обратное, то есть поиск только внутри блоков комментариев, было бы очень полезно.

Среда: VS 2003

Ответы [ 4 ]

3 голосов
/ 10 сентября 2008

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

Я написал анализатор строк и комментариев для C #, дайте мне посмотреть, смогу ли я найти что-то, что поможет ... Я обновлю, если найду что-нибудь.

EDIT: ... хорошо, так что я нашел свой старый проект 'codemasker'. Оказывается, я делал это поэтапно, а не с помощью одного регулярного выражения. Обычно я просматриваю исходный файл в поисках начальных токенов, а затем нахожу один, затем ищу конечный токен и маскирую все промежуточное. При этом учитывается контекст стартового токена ... если вы найдете токен для «начала строки», то вы можете спокойно игнорировать токены комментариев, пока не найдете конец строки, и наоборот. Как только код замаскирован (я использовал направляющие как маски и хеш-таблицу для отслеживания), вы можете безопасно выполнить поиск и замену, а затем, наконец, восстановить замаскированный код.

Надеюсь, это поможет.

2 голосов
/ 11 сентября 2008

Регулярное выражение не лучший инструмент для работы.

FAQ по Perl :

C комментариев:

#!/usr/bin/perl
$/ = undef;
$_ = <>; 

s#/\*[^*]*\*+([^/*][^*]*\*+)*/|([^/"']*("[^"\\]*(\\[\d\D][^"\\]*)*"[^/"']*|'[^'\\]*(\\[\d\D][^'\\]*)*'[^/"']*|/+[^*/][^/"']*)*)#$2#g;
print; 

C ++ комментарии:

#!/usr/local/bin/perl
$/ = undef;
$_ = <>;

s#//(.*)|/\*[^*]*\*+([^/*][^*]*\*+)*/|"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[^/"']+#  $1 ? "/*$1 */" : $& #ge;
print;
2 голосов
/ 10 сентября 2008

Будьте особенно осторожны со строками. Струны часто имеют escape-последовательности, которые вы также должны соблюдать, находя их конец.

Так, например, "This is \"a test\"". Вы не можете слепо искать двойную кавычку, чтобы закончить. Также остерегайтесь `` "Это \" `, который показывает, что вы не можете просто сказать", если двойным кавычкам не предшествует обратный слеш. "

Итак, проведите несколько жестоких юнит-тестов!

1 голос
/ 10 сентября 2008

Я бы сделал копию и сначала удалил комментарии, а затем начал бы искать строку обычным способом.

...