如何使用通配符查找和替换多行代码?

How do you Find and Replace multiple lines of code using Wildcards?

我们的 selenium 测试框架中散布着以下代码行:

{
    {IWebElement}.Clear();
    {IWebElement}.SendKeys({string});
}

我在基础 class 中创建了一个方法,它执行以下操作:

public void ClearFieldAndSendKeys(IWebElement textField, string keysToSend)
{
    textField.Clear();
    textField.SendKeys(keysToSend);
}

用新方法手动替换原始行的每个实例会花费太多时间,所以我下载了一个“多行搜索和替换工具”,可以在这里找到: https://marketplace.visualstudio.com/items?itemName=PeterMacej.MultilineSearchandReplace

计划是使用整个解决方案中的查找和替换工具执行全部替换,执行如下操作:

查找:

{
    {Wildcard1}.Clear();
    {Wildcard1}.SendKeys({Wildcard2});
}

替换:

{
    ClearFieldAndSendKeys({Wildcard1}, {Wildcard2});
}

但是,我已经试过了,但没有成功。我也尝试过分两步进行,其中只有第一个通配符被找到并被替换,但这也没有用。

在这里发帖,看看是否有人成功地完成了我正在努力做的事情。

A regular expression search-and-replace 可以帮助你。

  1. Ctrl + Shift + R调出全局搜索和替换对话框。

  2. 在搜索选项中选择“正则表达式”。

  3. 输入正则表达式并全部替换。

但首先,让我们使用 ClearFieldAndSendKeys 的扩展方法,因为这对于 C# 来说更加惯用:

static class IWebElementExtensions
{
    internal static void ClearFieldAndSendKeys(this IWebElement textField, string keysToSend)
    {
        textField.Clear();
        textField.SendKeys(keysToSend);
    }
}

现在你可以用{WildCard1}.ClearFieldAndSendKeys({WildCard2})调用它了。

这让我们想到了正则表达式。

你基本上想要获取一个变量、字段或 属性 名称,'Clear()' 方法调用,然后是白色 space,然后是相同的标识符和传递给 'SendKeys':

(.+)\.Clear\(\);[ \t\n\r]+(.+).SendKeys\(([^)]+)\);
 1.      2.         3.     4.     5.       6.    7.
  1. (.+) — 任何字符 . 一次或多次 +.+ 周围的括号创建了一个 back-reference,您可以在替换文本中使用 </code>。这应该是 IWebElement 的字段、变量或 属性。</p> </li> <li><p><code>\.Clear\(\); — 'Clear()' 方法的其余调用。括号字符使用 \ 进行转义,因此它们被视为文字括号,并且不会创建 back-reference.

  2. [ \t\n\r]+ — Space 个字符、制表符、换行符和回车 returns [ \t\n\r] 一次或多次 +.

  3. (.+) — 任何字符 . 一次或多次 +.+ 周围的括号创建了第二个 back-reference,您可以在替换文本中使用 </code>.</p> </li> <li><p><code>.SendKeys\( — 调用 'SendKeys(...)' 的开头在左括号处缩短。下一位捕获发送到 'SendKeys'.

    的参数
  4. ([^)]+) — 第三个 back-reference 捕获传递给 'SendKeys' 方法的参数。这个有点靠不住。 [^)] 是一个字符 class 匹配“任何 不是 右括号的字符”,因为右括号是方法调用的参数列表的末尾.此反向引用可在您的替换文本中作为 </code>.</p> 访问 </li> <li><p><code>\); — 只是一些垃圾文本来匹配方法调用的结尾,因此您的 search-and-replace 不会在 Visual Studio 中引入 1,300 个构建错误。

这使您的替换文本:

.ClearFieldAndSendKeys();

正则表达式值得花时间学习。它们不是常规的,但它们是实时的节省者。正则表达式是文本处理的“瑞士军刀”,是使优秀开发人员成为优秀开发人员的技能之一。

采用 Greg Burghardt 的非常有用的答案,我发现我们的解决方案是:

查找:

(.+)\.Clear\(\);[ \t\n\r]+(.+).SendKeys\(([^)]+)\);

替换:

ClearFieldAndSendKeys(, );

接着使用格式化所有文件工具整理代码: https://marketplace.visualstudio.com/items?itemName=munyabe.FormatAllFiles