2016-05-22 74 views
1

我重構了一個非常大的C項目,我需要找出由特定程序員編寫的代碼的一部分。 幸運的是,每個參與此項目的人都使用標準C風格評論中的電子郵件地址標記自己的代碼。正則表達式:提取兩個字符串之間的文本匹配特定字的文本

好吧,有人可以說,這可以通過命令行grep輕鬆實現,但這不是我的目標:我可能需要刪除此評論或用其他文本替換它們,所以正則表達式是唯一的解決方案。

Ex。

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

this post我找到了正確的表達式搜索對於C風格的註釋是:

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

但是,這是不夠的!我只需要包含特定電子郵件地址的評論。幸運的是,我期待的電子郵件地址域在整個項目中似乎是獨一無二的,所以這可以使它更簡單。

我想我必須用一些積極的預測先行斷言,我已經試過這一個:

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

,但它不運行! 有什麼建議嗎?

+0

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

+0

'\/\ *。* author:。* @ 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有助於構建更高效的模式。

相關問題