Вы избегаете //
-комментированных строк с:
^(?!\/\/).*
Объяснение (также в regex101 ):
^
Начало строка (?!\/\/)
Не буквальное ведение //
(это отрицательный прогноз ) .*
Любое число любого символа (для пропуска пустых строк, измените на .+
)
Если вы беспокоитесь о пробелах, вместо этого используйте ^(?!\s*\/\/).*
.
Теперь, чтобы перейти к части о сопоставлении только строки тройка.
Если вы хотите сопоставить больше, чем отсутствие комментария, измените .*
на то, что вы хотите сопоставить. Я не совсем уверен, что вы хотите сопоставить, а не сопоставить, так что это предположение, основанное на том, какие намерения я могу почерпнуть из вашей попытки.
^(?!\/\/).*\bMessagebox\((?!.*\bmb_taskmodal\b).*
Здесь есть вышеупомянутое исключение для закомментированных строк, а затем он соответствует Messagebox(
после несловесного символа (или ничего) , за исключением , если за ним в конечном итоге следует mb_taskmodal
как полное слово, а затем все остальное.
Я использую \b
немного здесь. Это означает, что ровно одна сторона (до или после \b
) имеет символ слова (букву, цифру или знак подчеркивания), а другая сторона не имеет слова. «B» означает «[слово] граница». Экранированные несловарные символы всегда являются литералами, поэтому \(
и \/
являются литералами (
и /
соответственно.
Обратите внимание, что это регулярное выражение все равно будет соответствовать Messagebox(a,b,c, mb_ok); // |mb_taskmodal);
. Устранение этого является нетривиальным, поскольку индикатор встроенного комментария состоит из двух символов. Я тоже могу ответить, но, надеюсь, вам это не нужно.
Решения с помощью grep:
$ grep -v '^//' FILENAME # discard comments
$ grep -v '^//' FILENAME |grep -vFw 'mb_taskmodal' # also discard mb_taskmodal
Флаг -v
Grep инвертирует совпадение. -F
отключает регулярные выражения и использует простое совпадение текста (быстрее), а -w
требует наличия границ слов вокруг запроса (так же, как \bmb_taskmodal\b
при условии GNU grep без -F
).
Решение для фильтрации комментариев в расширенном регулярном выражении (ERE) (без поиска):
(Если вы используете grep, рассмотрите grep -v '^//' FILENAME
)
^(.?$|[^\/]{2}|[^\/]\/|\/[^\/]).*
Объяснение (также в regex101 ):
^
Начало строки (…)
Группа захвата (PCRE может запретить захват с помощью (?:…)
вместо), содержащая либо - Чередование один
.?
Любой символ, ноль или один раз (измените на ..?
, чтобы пропустить пустые строки) $
Конец строки
- Чередование два
[^\/]{2}
Любой символ, кроме /
, дважды
- Чередование три
[^\/]
Любой символ, кроме /
\/
Литерал /
- Чередование четыре (порядок поменялся местами)
- * 111 6 * Литерал
/
[^\/]
Любой символ, кроме /
.*
Любое число любого символа ( включая ноль, требуется для чередования 1)
Это будет соответствовать пустой строке или строке, например /
или j
, или более длинной строке без комментариев.