google 应用程序脚本中的部分文本元素内的正则表达式替换

Regex replacement within a partial text element in google apps script

下面是 Google 加粗部分文本元素的示例。这用于不是整个元素的选定文本(例如,仅选择了一个句子片段)。我需要用执行正则表达式替换的动作来替换胆大妄为的动作。 replaceText() 函数不接受整数来告诉它从哪里开始和结束(与 setBold() 函数不同)。

This 是一个非常相似(未回答)的问题,但我相信 Google 脚本更改了一些命令,因此我认为值得再次发布。

Google例子是:

// Bold all selected text.
var selection = DocumentApp.getActiveDocument().getSelection();
if (selection) {
  var elements = selection.getRangeElements();
  for (var i = 0; i < elements.length; i++) {
    var element = elements[i];

    // Only modify elements that can be edited as text; skip images and other non-text elements.
    if (element.getElement().editAsText) {
      var text = element.getElement().editAsText();

      // Bold the selected part of the element, or the full element if it's completely selected.
      if (element.isPartial()) {
        text.setBold(element.getStartOffset(), element.getEndOffsetInclusive(), true);
      } else {
        text.setBold(true);
      }
    }
  }
}

replaceText 方法的正则表达式实现不支持环视或捕获组,因此无法用它执行此类部分替换。

解决方法是使用 JavaScript 替换来准备新的子字符串,然后使用 replaceText 将其放置到位。这会保留文本的格式,即使斜体部分与发生替换的选择重叠。一个潜在的缺点是,如果元素包含一段与选择相同的文本,替换也会在那里发生。

var text = element.getElement().editAsText();
if (element.isPartial()) {
  var start = element.getStartOffset();
  var finish = element.getEndOffsetInclusive() + 1; 
  var oldText = text.getText().slice(start, finish);
  var newText = oldText.replace(/a/g, "b");
  text.replaceText(oldText, newText);  
}