Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
搜索并替换C#表达式_C#_Regex_Visual Studio_Roslyn - Fatal编程技术网

搜索并替换C#表达式

搜索并替换C#表达式,c#,regex,visual-studio,roslyn,C#,Regex,Visual Studio,Roslyn,我一次又一次地发现自己需要改变一个方法调用与另一个方法调用的用法 例如,我有100次类似的方法调用: Helper.GetIntFromData(packetData.Skip(offset).Take(length).ToArray()); 需要改成 Helper.GetIntFromData(packetData, offset, length); 使用正则表达式可以相对容易地解决这一问题。但是如果空格(有时)起作用怎么办 Helper.GetIntFromData(packetData

我一次又一次地发现自己需要改变一个方法调用与另一个方法调用的用法

例如,我有100次类似的方法调用:

Helper.GetIntFromData(packetData.Skip(offset).Take(length).ToArray());
需要改成

Helper.GetIntFromData(packetData, offset, length);
使用正则表达式可以相对容易地解决这一问题。但是如果空格(有时)起作用怎么办

Helper.GetIntFromData(packetData
    .Skip(  offset  )
    .Take(  length  )
    .ToArray()  
);
使用正则表达式仍然可行,但现在它是一堆无法读取的可选空白标记

好的,但是如果参数不总是简单的标识符,而是任意表达式呢

Helper.GetIntFromData(obj.GetData(true).Skip( 7 + GetOffset( item.GetData() ) )
    .Take( length1 / length2 ).ToArray());
这就是正则表达式真正崩溃的地方

我的问题是: 今天可以吗?(以使你保持理智的方式,即不使用正则表达式)

是否有一个VS扩展或独立工具可以在更高(语义)级别上处理搜索和替换C代码

可以让我搜索(我想象)的东西:

并替换为

Helper.GetIntFromData($1, $2, $3)

C#有这样的工具吗?(我想它可以建在罗斯林附近。)

再考虑一下,你试图实现的目标是危险的,最好避免。正则表达式匹配/替换是有限的功能。它无法“理解”复杂的代码,并且注定会失败。考虑一个例子(如果代码有意义的话,让我们忽略一秒):

Helper.GetIntFromData(packetData.Skip(skipArray.Take(1)).Take(length.ToArray())


不是专门为避免“错误的
Take
”而定制的正则表达式是不可能的。自动替换方法破坏代码只是时间问题,而您唯一的希望是它足够残酷,可以生成编译时错误。这可能会造成难以发现的运行时异常或更糟糕的、无法解释的行为。代码重构应该使用理解代码的工具,而不是识别文本模式的工具来完成。

如果可能的话,我会“手动”完成,但使用简单的正则表达式(是的,我知道你说没有它们,Amit的答案“看起来不错”,尽管我没有检查它的边缘情况)

大概是这样的:

替换
(Helper.GetIntFromData.*?\。跳过\(
\1,
以获取

Helper.GetIntFromData(packetData, offset).Take(length).ToArray());
Helper.GetIntFromData(obj.GetData(true),  7 + GetOffset( item.GetData() ) )
    .Take( length1 / length2 ).ToArray());
Helper.GetIntFromData(packetData, offset, length).ToArray());
Helper.GetIntFromData(obj.GetData(true),  7 + GetOffset( item.GetData() ) 
    ,  length1 / length2 ).ToArray());
Helper.GetIntFromData(packetData, offset, length);
Helper.GetIntFromData(obj.GetData(true),  7 + GetOffset( item.GetData() ) 
    ,  length1 / length2 );
然后替换
(Helper.GetIntFromData.*?\)\。使用
\1、
获取\(

Helper.GetIntFromData(packetData, offset).Take(length).ToArray());
Helper.GetIntFromData(obj.GetData(true),  7 + GetOffset( item.GetData() ) )
    .Take( length1 / length2 ).ToArray());
Helper.GetIntFromData(packetData, offset, length).ToArray());
Helper.GetIntFromData(obj.GetData(true),  7 + GetOffset( item.GetData() ) 
    ,  length1 / length2 ).ToArray());
Helper.GetIntFromData(packetData, offset, length);
Helper.GetIntFromData(obj.GetData(true),  7 + GetOffset( item.GetData() ) 
    ,  length1 / length2 );
最后替换
(Helper.GetIntFromData.*?\)\.ToArray\(\)\)带有
\1\)获取

Helper.GetIntFromData(packetData, offset).Take(length).ToArray());
Helper.GetIntFromData(obj.GetData(true),  7 + GetOffset( item.GetData() ) )
    .Take( length1 / length2 ).ToArray());
Helper.GetIntFromData(packetData, offset, length).ToArray());
Helper.GetIntFromData(obj.GetData(true),  7 + GetOffset( item.GetData() ) 
    ,  length1 / length2 ).ToArray());
Helper.GetIntFromData(packetData, offset, length);
Helper.GetIntFromData(obj.GetData(true),  7 + GetOffset( item.GetData() ) 
    ,  length1 / length2 );

Resharper具有语义搜索和替换功能

Helper.GetIntFromData(packetData.Skip($offset$).Take($length$).ToArray());

它不区分空格,您可以将标记匹配限制为特定类型。我一直用它来做你想做的事。我还没有看到任何基于roslyn的项目能够让所有用户如此轻松地完成这项工作

这是resharpers网站上的功能介绍


老兄,我永远也做不到这一点。我想是时候再试一次了。这就是为什么我要问语义搜索/替换——而不是像正则表达式那样的语法。