如何使用通配符查找和替换多行代码?
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 可以帮助你。
按Ctrl + Shift + R调出全局搜索和替换对话框。
在搜索选项中选择“正则表达式”。
输入正则表达式并全部替换。
但首先,让我们使用 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.
(.+)
— 任何字符 .
一次或多次 +
。 .+
周围的括号创建了一个 back-reference,您可以在替换文本中使用 </code>。这应该是 IWebElement 的字段、变量或 属性。</p>
</li>
<li><p><code>\.Clear\(\);
— 'Clear()' 方法的其余调用。括号字符使用 \
进行转义,因此它们被视为文字括号,并且不会创建 back-reference.
[ \t\n\r]+
— Space 个字符、制表符、换行符和回车 returns [ \t\n\r]
一次或多次 +
.
(.+)
— 任何字符 .
一次或多次 +
。 .+
周围的括号创建了第二个 back-reference,您可以在替换文本中使用 </code>.</p>
</li>
<li><p><code>.SendKeys\(
— 调用 'SendKeys(...)' 的开头在左括号处缩短。下一位捕获发送到 'SendKeys'.
的参数
([^)]+)
— 第三个 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
我们的 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 可以帮助你。
按Ctrl + Shift + R调出全局搜索和替换对话框。
在搜索选项中选择“正则表达式”。
输入正则表达式并全部替换。
但首先,让我们使用 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.
(.+)
— 任何字符.
一次或多次+
。.+
周围的括号创建了一个 back-reference,您可以在替换文本中使用</code>。这应该是 IWebElement 的字段、变量或 属性。</p> </li> <li><p><code>\.Clear\(\);
— 'Clear()' 方法的其余调用。括号字符使用\
进行转义,因此它们被视为文字括号,并且不会创建 back-reference.[ \t\n\r]+
— Space 个字符、制表符、换行符和回车 returns[ \t\n\r]
一次或多次+
.
的参数(.+)
— 任何字符.
一次或多次+
。.+
周围的括号创建了第二个 back-reference,您可以在替换文本中使用</code>.</p> </li> <li><p><code>.SendKeys\(
— 调用 'SendKeys(...)' 的开头在左括号处缩短。下一位捕获发送到 'SendKeys'.([^)]+)
— 第三个 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