vscode 替换文件中的文本并不像预期的那样工作,匹配中包含换行符,

uelo1irk  于 3个月前  发布在  Vscode
关注(0)|答案(5)|浏览(51)

类型:Bug

重现步骤

  1. 创建新文件并填写以下内容。
child: asdf; asdf
}
  1. 按Cmd+Shift+H,打开正则表达式选项(Cmd+Option+R),将查找文本填入 child: (\w+);(?=[\S\s\n]*?\}) ,替换文本填入 $1
  2. 查看预览或执行替换操作。

预期行为

child: asdf 应该被替换为 asdf

实际行为

child: asdf 被替换为 $1

附加信息

正常单文件替换按预期工作。
如果匹配项中没有换行符,它也按预期工作。
VS Code版本:Code - Insiders 1.75.0-insider ( b229eb5 , 2023-01-27T22:17:24.641Z)
操作系统版本:Darwin x64 22.1.0
模式:
沙箱:是
系统信息
| 项目 | 值 |
| ------------ | ------------ |
| CPUs | Intel(R) Core(TM) i5-8500 CPU @ 3.00GHz (6 x 3000) |
| GPU状态 | 2d_canvas: enabledcanvas_oop_rasterization: disabled_offdirect_rendering_display_compositor: disabled_off_okgpu_compositing: enabledmetal: disabled_offmultiple_raster_threads: enabled_onopengl: enabled_onrasterization: enabledraw_draw: disabled_off_okskia_renderer: enabled_onvideo_decode: enabledvideo_encode: enabledvulkan: disabled_offwebgl: enabledwebgl2: enabledwebgpu: disabled_off |
| 负载(平均) | 2, 2, 6 |
| 内存(系统) | 24.00GB (0.02GB free) |
| 进程参数 | |
| 屏幕阅读器 | no |
| VM | 0% |扩展名:无A/B实验

y3bcpkx1

y3bcpkx11#

我在这里放一个注解。

问题

对于我来说,正则表达式匹配组替换在Unicode字符上不起作用。

用$X($0 $1, $2, $3 ...)替换匹配组失败。

经过测试,我删除了"This is a test-",这一行,现在它甚至在文件中找不到匹配项,尽管"കണ്ടന്നുമുതൽ തൻ-",仍然存在。

解决方案

但后来我从这里学到,尽管\w匹配Unicode字符,但最好使用\p{L}

编辑:

它仍然无法匹配每个Unicode字母。

我尝试通过一个没有空格的-捕获每个Unicode字母。

nqwrtyyt

nqwrtyyt2#

在您的案例中,您可能需要在匹配 \n 之前转义 \,如下所示:

F: \\n

如果您必须将 child: asdf 替换为 asdf,那么为什么还要使用正则表达式呢?您可以直接这样做:

F: child: asdf;
R: asdf;

qlckcl4x

qlckcl4x3#

这是一个简化的报告示例。我不记得原始用例,但这并不重要。因为asdf可以是任何东西,所以我不得不使用正则表达式。

nmpmafwu

nmpmafwu4#

但是后来我从这里学到,尽管\w匹配Unicode字符,但最好使用\p{L}。
我注意到\p{L}仅在PCRE中使用语法,但打开文件应该使用JS引擎处理正则表达式(https://github.com/microsoft/vscode/wiki/Search-Issues#notes-on-regular-expression-support)。话虽如此,你可能需要寻找一种同时适用于两种引擎且干净的方法,遗憾的是

yyhrrdl8

yyhrrdl85#

我找到了一个更简单的复现方法:
在单文件查找和替换中,将正则表达式 \s 替换为 `` ,文件中的换行符不会发生变化。

相关问题