【问题标题】:Visual Studio Code: Find and replace specific text programmatically by using an ExtensionVisual Studio Code:使用扩展以编程方式查找和替换特定文本
【发布时间】:2021-02-24 11:58:40
【问题描述】:

首先让我说我对 Typescript/javacript 不太了解,但是我每天都使用 VSC,并且想用它来搜索和替换一些文本,比如说 'sqlstatement' 并将其替换为另一个文本,例如“SQL_Statement”。

如果我手动选择,我可以替换选择:

const selection = editor.selection;
editor.edit(editBuilder => {editBuilder.replace(selection, "SQL_Statement");

但我想通过代码找到“sqlstatement”文本,但不知道如何。

如果有其他选项可以导致相同的结果,我猜也可以。 我尝试过的事情是:

let text = editor.document.getText();
text1 = text.replace("sqlstatement","SQL_Statement");

这适用于替换字符串,但在这种情况下,我不知道如何将此“text1”重新应用于文档。

【问题讨论】:

标签: typescript visual-studio-code vscode-extensions


【解决方案1】:

您必须构造要替换的文本的vscode.Range。并在您从editor 获得的EditBuilder 中使用此Range

在文档文本中找到字符位置startend,并将此位置转换为行字符Position (editor.document.positionAt(offset)),并使用这两个Positions 构建Range

【讨论】:

  • 感谢您的回答,如果我知道如何获取要替换的文本的范围就好了。我知道在我的示例中,“选择”是一个范围,但那是因为我手动选择了“选择”。在我发现的所有示例中,我看到人们谈论必要的范围,但找不到确定“sqlstatement”文本所在范围的方法。而且我想我花了很多时间寻找解决方案。
  • @mrpalferink 阅读第二段
  • 这一定是我对编码的理解有限,但是当你说“查找文档文本中开始和结束的字符位置”时,我如何自动在打开的文档中找到单词的位置sqlstatement”的定位?一旦找到它,我想我将能够获取范围并替换文本。
  • @mrpalferink 你如何在字符串中搜索单词?
  • 我猜这就是问题所在,我不知道该怎么做。我现在正在使用这段代码,它做了它应该做的事情,但似乎像射击佳能杀死一只苍蝇:-| .它将整个文档文本设置在一个字符串中,替换此字符串中的某些内容并通过替换所有文本将字符串发送回文档。但最好能得到我要替换的字符串的确切位置/范围,然后替换那段。
【解决方案2】:

遇到了同样的问题并解决了。 如果我的问题是正确的,您想用“SQL_Statement”替换所有出现的“sqlstatement”。

你需要使用正则表达式。

const textEditor = vscode.window.activeTextEditor;
if (!textEditor) {
  vscode.window.showErrorMessage("Editor Does Not Exist");
  return;
}

let fullText = editor.document.getText();
// 'g' flag is for global search & 'm' flag is for multiline.
const regex = /sqlstatement/gm; 
//searching for previously declared 'sqlstatement' in regex and replacing it with 'SQL_Statement'.
let textReplace = fullText.replace(regex, `SQL_Statement`);
let invalidRange = new vscode.Range(0, 0, editor.document.lineCount, 0);
let validFullRange = editor.document.validateRange(invalidRange);

  editor.edit(editBuilder => {
    editBuilder.replace(validFullRange, textReplace);
  }).catch(err => console.log(err));

Regexp g 标志用于全局搜索以匹配所有出现,没有它,它只会检查第一个。

正则表达式m 标志用于多行,它使^$ 分别匹配行首和行尾(而不是字符串)。

参考:global - JavaScript | MDNmultiline - JavaScript | MDN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-06
    • 2023-02-09
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多