VS Code 使用正则表达式跨文件查找和替换以纠正出现在特定行上的引号数量错误

Posted

技术标签:

【中文标题】VS Code 使用正则表达式跨文件查找和替换以纠正出现在特定行上的引号数量错误【英文标题】:VS Code Find and Replace across files using Regex to correct error in number of quotes appearing on a particular line 【发布时间】:2021-07-11 15:17:06 【问题描述】:

编辑: 虽然@Wiktor Stribiżew 的回答帮助我解决了这两个问题(再次感谢!),但我遇到了第三个问题,与第二个问题一样。

错误:

"Image" : "'Motorola_About'

“Motorola_About”线程之前有一个不需要的单引号,需要将结束引号更改为双引号。冒号(:)前后有空格,需要保留。

我在上一期给出的答案行中尝试了以下代码 查找:

(" : ")"([^']*_About[^']")
("/s:/s")"([^']*_About[^']")

替换:

$1$2

这两种方法都不起作用。如果能告诉我哪里出错了,将不胜感激。

轨迹: 我正在尝试使用 VS Code(版本 1.55.2)的“在文件中替换”来纠正出现在多个文件的特定行上的引号数量错误。 在这两种错误情况下,有一个额外的单引号 (') 错误地出现在同一位置(图像名称之前),我需要在所有文件中删除它。

错误类型 1:

html file1 Line 50: 'ImageName':''Microsoft_About',
html file2 Line 51: 'ImageName':''Motorola_About',
html file3 Line 53: 'ImageName':''Apple_About',

..等等,跨越 450 个奇怪的文件

错误类型 2:

html file9 Line 50: "ImageName":"'Microsoft_About",
html file12 Line 51: "ImageName":"'Motorola_About",
html file15 Line 53: "ImageName":"'Apple_About",

.. 以此类推,在另外 350 个奇怪的文件中

我尝试在“文件替换”中使用以下正则表达式代码: 对于错误1:

FIND: ([''])([a-zA-Z0-9,.-]+_)(_About')
REPLACE: $2_About' 

对于错误2:

FIND: (["'])([a-zA-Z0-9,.-]+_)(_About')
REPLACE: $2_About' 

它不工作。我是 Regex 的新手,不熟悉代码,因此非常感谢任何帮助和建议。

【问题讨论】:

【参考方案1】:

对于您可以使用的第一组文件

查找'('[^']*)(_About')替换$1$2

请参阅regex demo。对于第二个,您可以使用

查找(":")'([^"]*_About") 替换$1$2

见this regex demo。

详情

'('[^']*)(_About') - 匹配',然后将' 和除' 之外的零个或多个字符捕获到组1 ($1) 中,然后将_About' 捕获到组2 ($2) )。 (":")'([^"]*_About") - ":" 首先被捕获到组 1 ($1),然后匹配 ',然后除 "_About" 之外的任何零个或多个字符被捕获到组 2。

匹配项被替换为适当的组值。

【讨论】:

嗨@Wiktor。感谢您非常有帮助的回复。它帮助我解决了这两个错误。但我意识到我也注意到了第三个错误。在这种情况下,它类似于第二个,但冒号前后有空格,并且右引号是单引号而不是双引号。 "Image" : "'Motorola_About'。我想保留空间,但将结束引号更改为双引号。我尝试通过稍微修改您的代码(" : ")'([^"]*_About[^']") 并替换为$1$2 来解决它,但它不起作用。你能帮忙吗? @MithunUchil 您可以使用(" : ")'([^"]*_About[^']*)' 并替换为$1$2",参见demo。 太棒了!!谢谢!! :)【参考方案2】:

我使用一个正则表达式来匹配这两种情况和相同的替换语句。 Regex Explanation

const regex = /('|")(.*?)(?:'|"):(?:'|")+(.*?)(?:'|")/;

const error1 = [`'ImageName':''Apple_About'`, `'ImageName':''Motorola_About'`, `'ImageName':''Microsoft_About'`];
const error2 = [`"ImageName":"'Microsoft_About"`,`"ImageName":"'Motorola_About"`, `"ImageName":"'Apple_About"`];

console.log(error1.map(err => err.replace(regex, '$1$2$1:$1$3$1')));
console.log(error2.map(err => err.replace(regex, '$1$2$1:$1$3$1')));

【讨论】:

嗨@a.mola。感谢您的快速回复。抱歉,您能否帮助我了解如何在“在文件中查找”和“在文件中替换”框中使用它?非常非常抱歉,也许我的查询不清楚,但每一行都属于一个单独的 html 文件。而且我需要“查找替换”来仅针对多个文件中的特定行。 好吧,我认为没有办法选择文件的特定行,但正则表达式应该会发现这种错误。然后还会显示行号,因此您可以删除不想更改的行。 [阅读更多] 这里(code.visualstudio.com/docs/editor/…) regex 放入find 框,将$1$2$1:$1$3$1 放入替换框

以上是关于VS Code 使用正则表达式跨文件查找和替换以纠正出现在特定行上的引号数量错误的主要内容,如果未能解决你的问题,请参考以下文章

在VS中用正则表达式查找或替换

vs 2012/2013 等工具中,使用正则表达式,查找替换

VS 2017 统计项目代码总行数

VS使用技巧——统计代码行数

在多个文件中查找和替换正则表达式的最佳工具是啥?

在UltraEdit的查找和替换中使用正则表达式 (转)