Visual Studio 代码中的多行正则表达式搜索
Multiline regular expression search in Visual Studio Code
多行正则表达式搜索在 VS Code 版本 1.27.2 中不起作用。
理论上 aaa(\n|.)*bbb
应该找到从 aaa 开始到 bbb 结束的字符串,但它不起作用。
这里提到的解决方案 也不起作用。
这种行为的原因很简单。
多行搜索尚未实现。
2018 年 11 月发布的 v1.29 中添加了多行搜索。请参阅 multi-line search。
VS Code now supports multiline search! Same as in the editor, a regex
search executes in multiline mode only if it contains a \n literal.
The Search view shows a hint next to each multiline match, with the
number of additional match lines.
This feature is possible thanks to the work done in the ripgrep tool
to implement multiline search.
Find Widget v1.38 即将推出多行搜索。参见 multiline find "pre-release" notes。
Multi Line search in Find Widget
The Find Widget now supports multiple line text search and replace. By
pressing Ctrl+Enter
, you can insert new lines into the input box.
.
Odd Ctrl+Enter 在查找小部件中,但在搜索面板中 Shift+Enter (请参阅下面的 Deepu 的回答)。 Shift+Enter 在 Find Widget 获得焦点时具有其他功能。
不使用正则表达式。
现在可以在 vs code 1.30 及更高版本中进行多行搜索,而无需使用正则表达式。
在搜索框中键入 Shift+Enter 以插入换行符,搜索框会变大以显示完整的多行查询.您还可以将编辑器中的多行选择复制并粘贴到搜索框中。
无正则表达式方式:您可以复制多行文本并将其粘贴为 "Find in files" 形式:
"Replace all"的结果:
您可以使用这个简单的正则表达式在多行中查找和替换:StringStart\r\nStringEnd
例如
public string MethodA(int x)
{
var user;
}
public string MethodB(string y)
{
var user;
}
public string MethodC(int x)
{
var user;
}
public string MethodD(float x)
{
var user;
}
如果您想将用户变量的名称替换为 customer 以及用户的方法参数名称,但仅限于 int 类型。
然后要查找的正则表达式将是:int x)\r\nEnterBlankSpacesHereToReachTheString{\r\nEnterBlankSpacesHereToReachTheStringvar用户
要替换的正则表达式将是:int user)\r\nEnterBlankSpacesHereToReachTheString{\r\nEnterBlankSpacesHereToReachTheStringvar customer
参考参考
是的,您可以在 VScode 中使用正则表达式进行多行搜索。
查找从 aaa
开始并以第一个 bbb
结束的多行文本块(惰性限定符)
aaa(.|\n)+?bbb
查找从 aaa
开始到最后一个 bbb
结束的多行文本块。 (贪婪限定符)
aaa(.|\n)+bbb
我遇到了类似的问题,这个对我来说效果更好:
aaa[.\n\r\t\S\s]*bbb
这包括回车 return (\r)、换行符 (\n)、制表符 (\t)、任何空白符 (\s) 和任何非空白符 (\S)。似乎有一些冗余放置“。”和 "\S" 在一起,但在我的情况下,如果没有两者,它就不起作用。
我一直在寻找一种快速的方法来做到这一点,我得到了以下结果:
start_text.*?(.|[\n])*?end_text
start_text 和 end_text 是多行搜索的范围。
分解正则表达式 ".?(.|[\n])?":
- ".?"将匹配从开始文本到行尾的任何字符。这 ”?”是否可以确保如果您的 end_text 在同一行上,那么 . 不会一直走到行尾(贪婪匹配与懒惰匹配)
- "(.|[\n])" 表示 character\whitespace 或换行
- "*?"指定不贪婪地匹配括号中的 0 个或多个表达式。
示例:
<meta.*?(.|[\n])*?/>
将从所有元标记的开头匹配到相应标记的结尾
<script.*?(.|[\n])*?</script>
将从所有脚本标签的开头匹配到相应的结束标签
警告:
在 start_text 或 end_text 中不正确或部分填充的情况下使用 .*?(.|[\n])*?
可能会使 VS Code 崩溃。我建议要么写出整个表达式(这不会导致问题),要么在粘贴到正则表达式之前写下开始和结束文本。无论如何,当我试图删除部分开始和结束文本时,VS Code 冻结并迫使我重新加载文件。话虽如此,老实说,我找不到在 VS Code 中工作得更好的东西。
多行正则表达式搜索在 VS Code 版本 1.27.2 中不起作用。
理论上 aaa(\n|.)*bbb
应该找到从 aaa 开始到 bbb 结束的字符串,但它不起作用。
这里提到的解决方案
这种行为的原因很简单。
多行搜索尚未实现。
2018 年 11 月发布的 v1.29 中添加了多行搜索。请参阅 multi-line search。
VS Code now supports multiline search! Same as in the editor, a regex search executes in multiline mode only if it contains a \n literal. The Search view shows a hint next to each multiline match, with the number of additional match lines.
This feature is possible thanks to the work done in the ripgrep tool to implement multiline search.
Find Widget v1.38 即将推出多行搜索。参见 multiline find "pre-release" notes。
Multi Line search in Find Widget
The Find Widget now supports multiple line text search and replace. By pressing
Ctrl+Enter
, you can insert new lines into the input box.
Odd Ctrl+Enter 在查找小部件中,但在搜索面板中 Shift+Enter (请参阅下面的 Deepu 的回答)。 Shift+Enter 在 Find Widget 获得焦点时具有其他功能。
不使用正则表达式。
现在可以在 vs code 1.30 及更高版本中进行多行搜索,而无需使用正则表达式。
在搜索框中键入 Shift+Enter 以插入换行符,搜索框会变大以显示完整的多行查询.您还可以将编辑器中的多行选择复制并粘贴到搜索框中。
无正则表达式方式:您可以复制多行文本并将其粘贴为 "Find in files" 形式:
"Replace all"的结果:
您可以使用这个简单的正则表达式在多行中查找和替换:StringStart\r\nStringEnd
例如
public string MethodA(int x)
{
var user;
}
public string MethodB(string y)
{
var user;
}
public string MethodC(int x)
{
var user;
}
public string MethodD(float x)
{
var user;
}
如果您想将用户变量的名称替换为 customer 以及用户的方法参数名称,但仅限于 int 类型。
然后要查找的正则表达式将是:int x)\r\nEnterBlankSpacesHereToReachTheString{\r\nEnterBlankSpacesHereToReachTheStringvar用户
要替换的正则表达式将是:int user)\r\nEnterBlankSpacesHereToReachTheString{\r\nEnterBlankSpacesHereToReachTheStringvar customer
参考参考
是的,您可以在 VScode 中使用正则表达式进行多行搜索。
查找从 aaa
开始并以第一个 bbb
结束的多行文本块(惰性限定符)
aaa(.|\n)+?bbb
查找从 aaa
开始到最后一个 bbb
结束的多行文本块。 (贪婪限定符)
aaa(.|\n)+bbb
我遇到了类似的问题,这个对我来说效果更好:
aaa[.\n\r\t\S\s]*bbb
这包括回车 return (\r)、换行符 (\n)、制表符 (\t)、任何空白符 (\s) 和任何非空白符 (\S)。似乎有一些冗余放置“。”和 "\S" 在一起,但在我的情况下,如果没有两者,它就不起作用。
我一直在寻找一种快速的方法来做到这一点,我得到了以下结果:
start_text.*?(.|[\n])*?end_text
start_text 和 end_text 是多行搜索的范围。
分解正则表达式 ".?(.|[\n])?":
- ".?"将匹配从开始文本到行尾的任何字符。这 ”?”是否可以确保如果您的 end_text 在同一行上,那么 . 不会一直走到行尾(贪婪匹配与懒惰匹配)
- "(.|[\n])" 表示 character\whitespace 或换行
- "*?"指定不贪婪地匹配括号中的 0 个或多个表达式。
示例:
<meta.*?(.|[\n])*?/>
将从所有元标记的开头匹配到相应标记的结尾<script.*?(.|[\n])*?</script>
将从所有脚本标签的开头匹配到相应的结束标签
警告:
在 start_text 或 end_text 中不正确或部分填充的情况下使用 .*?(.|[\n])*?
可能会使 VS Code 崩溃。我建议要么写出整个表达式(这不会导致问题),要么在粘贴到正则表达式之前写下开始和结束文本。无论如何,当我试图删除部分开始和结束文本时,VS Code 冻结并迫使我重新加载文件。话虽如此,老实说,我找不到在 VS Code 中工作得更好的东西。