正则表达式挑战:修改此行的C#

时间:2011-01-03 19:29:30

标签: c# regex

我正在开发一个使用POCO实体数据模型的RIA域服务。由于POCO类没有实现EntityState属性,因此默认域服务模板需要一些修复,EntityObject也是如此。

Julie Lerman提供了解决方案:

 OLD: if ((customer.EntityState == EntityState.Detached)) 
 NEW: if ((GetEntityState(customer) != EntityState.Detached))

问题是我可能不得不在开发过程中多次重新生成域服务,并且有很多表/实体需要处理。

问题:

上面的“OLD”可以使用正则表达式替换为“NEW”吗?这是一个非常可预测的模式:

  
      
  1. 查找'.EntityState'
  2. 的实例   
  3. 替换为“GetEntityState([text between ( and .])
  4.   

3 个答案:

答案 0 :(得分:3)

使用 Visual Studio 查找和替换(以及使用正则表达式 >当然):

找到什么: if \(\({:i}\.EntityState == EntityState\.Detached\)\)

替换为: if ((GetEntityState(\1) == EntityState.Detached))

修改

OP似乎更喜欢 Expresso 。在这种情况下,它会是这样的:

正则表达式: if \(\((\w+)\.EntityState == EntityState\.Detached\)\)

替换字符串: if ((GetEntityState($1) == EntityState.Detached))

(同样修正了!=错字)

答案 1 :(得分:2)

s/(\w+)\.(EntityState)/Get\2(\1)/

编辑:您没有要求将==翻转到!=,但我不确定它应该是相反的功能

编辑2 :另外,如果您想在一行中多次执行此操作,请在末尾添加g

答案 2 :(得分:0)

如果您有ReSharper,则可以使用其结构化搜索和替换功能。然后你将捕获除if语句之外的其他位置 - 它将足够聪明地找到引用EntityState属性的任何表达式,并将其转换为方法调用。如果你愿意,你甚至可以将它限制在某些类中,尽管听起来在这种情况下可能没有必要。

  1. 转到ReSharper>查找>搜索模式
  2. 在“搜索模式”框中,键入:$obj$.EntityState
  3. 在右侧列表框上方,点击“添加占位符>表达式”。输入obj作为名称。将“表达式类型”留空,或者如果要缩小搜索范围,请输入您的POCO类型名称。单击“确定”。
  4. 点击右上角的“替换”按钮。对于“替换模式”,请键入:GetEntityState($obj$)