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

时间:2016-06-12 16:24:05

标签: regex google-apps-script google-docs

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

This是一个非常相似(未答复)的问题,但我相信Google Scripts已经更改了一些命令,因此我认为值得重新发布。

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);
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

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);  
}