2016-05-22 3 views
1

Я обновляю очень большой проект C, и мне нужно выяснить часть кода, написанную конкретным программистом. К счастью, каждый парень, участвующий в этом проекте, отмечает свой собственный код, используя свой адрес электронной почты в стандартных комментариях стиля C.regex: извлечь текст между двумя строками с текстом, который соответствует определенному слову

Хорошо, кто-то может сказать, что это может быть легко достигнуто с помощью grep из командной строки, но это не моя цель: мне может потребоваться удалить эти комментарии или заменить их другим текстом, поэтому регулярное выражение является единственным решением.

Ex.

/********************************************* 
* 
* ... some text .... 
* 
* author: [email protected] 
* 
*********************************************/ 

От this post я нашел правильное выражение для поиска комментариев в стиле C, который является:

\/\*(\*(?!\/)|[^*])*\*\/ 

Но этого не достаточно! Мне нужны только комментарии, содержащие конкретный адрес электронной почты. К счастью, домен адреса электронной почты, который я ищу, кажется уникальным во всем проекте, поэтому это может сделать его проще.

Я думаю, что я должен использовать некоторые положительные опережения утверждение, я попытался это одно:

(\/\*)(\*(?!\/)|[^*](?=.*domain.com))*(\*\/) 

, но он не работает! Любые советы?

+0

['\/\ * [^ *] * (?: \ * (?! \ /) [^ *] *) * @ Domain \ .com [^ *] * (?: \ * (?! \ /) [^ *] *) * \ * \/'] (https://regex101.com/r/nW8uP2/1)? –

+0

'\/\ *. * Автор:. * @ Domain \ .com. *? \ * \ /' Должен совпадать. – Saleem

+0

@Saleem, [он будет перегорать] (https://regex101.com/r/mV2bU2/1), не полагайтесь на '. *', Когда имеете дело с совпадением внутри помеченного текста. –

ответ

0

Вы можете использовать

\/\*[^*]*(?:\*(?!\/)[^*]*)*@domain\.com[^*]*(?:\*(?!\/)[^*]*)*\*\/ 

См regex demo

шаблон детали:

  • /\* - комментарии начать
  • [^*]*(?:\*(?!\/)[^*]*)* - все, но */
  • @domain\.com - буквальный domain.com
  • [^*]*(?:\*(?!\/)[^*]*)* - все, кроме */
  • \*\/ - конец комментария

Более быстрая альтернатива (как первая часть будет искать все, кроме комментария конца и слово @domain):

\/\*[^*@]*(?:\*(?!\/)[^*@]*|@(?!domain\.com)[^*@]*)*@domain\.com[^*]*(?:\*(?!\/)[^*]*)*\*\/ 

S ee another demo

В этих шаблонах я использовал развернутую конструкцию для (\*(?!\/)|[^*])*: [^*]*(?:\*(?!\/)[^*]*)*. Unrolling помогает создавать более эффективные шаблоны.