2016-11-01 33 views
3

我期待重構大量的類。將接口添加到具有特定命名模式的所有類

所有類都遵循命名約定

class SomethingModel 

我想找到他們,並與

class SomethingModel : IModel 

取代他們,但我也想排除一些模板派生我有一個看起來像

class SomethingController : GenController<SomethingModel> 

我想在Visual Studio中做到這一點。

最明顯的選擇是正則表達式查找和替換,但我也有ReSharper的和理想的情況下我會使用模式搜索做替換

通過對正則表達式的問題,一些搜索我已經拿到了第一部分工作

(?<=class)(.*Model) 

但我似乎無法排除該模板。我開始與

(class .*Model)(?!"(?<="Generic")) 

打我很少使用正則表達式,如果有一個無正則表達式解決方案,我會更喜歡它。特別是我很喜歡用ReSharper的搜索與模式

這點我嘗試用下面的: enter image description here 從我的所有類真正行之有效....除了成爲空...語句標籤似乎不工作(設置爲inifinite)

UPDATE

陽性病例:

  • 公共類DoorModel
  • 公共類HandleModel
  • 公共類BellModel

陰性病例

  • 公共類DoorController:GenericController
  • 公共類WindowModel:IModel
+0

特殊情況對我來說很清楚。你想匹配所有以「Model」結尾的類,它們尚未實現接口或從某個類繼承?也許正面比賽和不應該匹配的東西將是有幫助的 – nozzleman

+0

好主意!但我不認爲有類型成員的佔位符 - 語句佔位符與類型成員的內容相匹配,但我們沒有任何要匹配的類型成員本身。 – citizenmatt

+0

@nozzleman增加了負面和正面名單 – chrispepper1989

回答

2

你可以嘗試搭配

(?<=class\s)(\w+Model)(?!\s+:\s*(GenericController|IModel)) 

,並使用第一個捕獲組這樣

\1 : IModel 

https://regex101.com/r/aMaPwF/4

+0

偉大的答案,可悲的視覺工作室似乎並不支持「\ 1」但記事本+ +所做的,所以我打開所有文件,並做了「全部替換所有打開的文檔:) – chrispepper1989

1

看到有,如果你想利用ReSharper的哈克解決方案取代。但它是一個黑客。

根據Jetbrains的模式搜索和替換是專爲功能,這就是爲什麼它不處理上面非常好我的課的例子(見我的談話here

我所做的就是打開所有的文件我想編輯並做了一個替換,以取代resharper忽略我的課程內容。

我希望我的ReSharper的模式取代,這樣我可以取代這種模式:

class $ClassName$ : IModel 
{ 

} 

與這一個

class $ClassName$ : AbstractModel<$ClassName$s>{} 

所以,我只是做了一個找到替換改爲「IModel」與「IModel {} // $$

然後運行resharper模式ce,然後工作,因爲它顯然沒有「看到」類的內容了。

然後我用「>」替換「> {} // $$」(因此額外的瘋狂符號)。

因此,它非常黑客,但它確實有效。幸運的是,它非常罕見,你想要做這樣的瘋狂的事情(通常應該避免所有的費用)。我實際上發現了一些其他的「Resharper黑客」,同時弄亂了這個代碼,我可能不得不在稍後發佈這些代碼。

相關問題