使用特定命名模式为所有类添加接口

时间:2016-11-01 14:32:00

标签: regex visual-studio replace resharper regex-lookarounds

我希望重构大量的课程。

所有类都遵循命名约定

class SomethingModel

我想找到所有这些并用

替换它们
class SomethingModel : IModel

但我也希望排除一些看起来像

的模板派生
class SomethingController : GenController<SomethingModel>

我正在尝试在Visual Studio中执行此操作。

显而易见的选择是正则表达式查找和替换,但我也有Resharper和理想情况下我会使用模式搜索替换

通过对正则表达式问题的一些搜索,我得到了第一部分工作

(?<=class)(.*Model)

但我似乎无法排除模板。我开始玩

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

我很少使用正则表达式,如果有非正则表达式解决方案,我会更喜欢它。特别是我非常想使用Resharper Search with Pattern

我尝试了以下内容: enter image description here 哪个工作得很好....除了我的所有课程都变空了...声明标签似乎不起作用(设置为无限)

更新

正面案例:

  • 公共类门模型
  • 公共类HandleModel
  • 公共类BellModel

否定案例

  • public class DoorController:GenericController
  • 公共类WindowModel:IModel

2 个答案:

答案 0 :(得分:2)

您可以尝试匹配

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

并使用第一个捕获组替换

\1 : IModel

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

答案 1 :(得分:1)

如果您希望利用Resharper,那就有一个hacky解决方案。但它是一个黑客。

根据Jetbrains的说法,模式搜索和替换是针对函数设计的,这就是为什么它不能很好地处理我上面的类示例(参见我的对话here

我所做的是打开我想要编辑的所有文件并执行查找替换以替换以获取resharper以忽略我的类内容。

我希望我的resharper模式替换,以便我可以替换此模式:

class $ClassName$ : IModel
{

}

这一个

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

所以我只是做了一个替换替换&#34; IModel &#34;使用&#34; IModel {} // $$ &#34;

然后运行resharper模式替换,然后工作,因为它显然没有&#34;看到&#34;班级的内容了。

然后我换了&#34;&gt; {} // $$&#34;用&#34;&gt;&#34; (因此是额外的疯狂符号)。

所以你非常hacky,但确实有效。值得庆幸的是,你很想做这样的疯狂事情(通常应该避免所有费用)。我实际上发现了其他一些&#34; Resharper hacks&#34;虽然搞乱了这段代码,我可能要稍后发布。