【问题标题】:Replace text regex not matching and format applied over entire text替换文本正则表达式不匹配和格式应用于整个文本
【发布时间】:2021-02-14 08:56:08
【问题描述】:

我有一个 Google Doc(只有 Word 之类的类型,而不是电子表格或其他任何类型),我需要在其中迭代一系列规则(正则表达式)并通过附加设置与规则匹配的样式。主体是这样的:

function showIssues() {
  var body = DocumentApp
             .getActiveDocument()
             .getBody();
  
  const rules = {
    fluff: {
      match: '\b(just|very)\b',
      color: '#FFDDDD'
    },
    adverbs: {
      match: '(\w+ly)\b',
      color: '#FF00FF'
    }
  };

  for (const [rule, definition] of Object.entries(rules)) {
    body.replaceText(definition.match, "<$1>")
        .asText()
        .setBackgroundColor(definition.color);
  }
}

但是,它不仅将匹配的文本替换为&lt;matched text&gt;,而且还会替换整个背景,而不仅仅是替换文本的背景。

我不太了解 Javascript,而且我以前从未编写过 Google Docs 插件。

如何匹配文本的微小 sn-ps 并设置它们的属性?

与本网站上的其他一些答案不同,我不做单个替换。每个规则可能与文档中的多个元素匹配。因此,我很确定我搞砸了:)

顺便说一句,其中一些文档将在 100K 字的范围内,因此它们可能相当大。

【问题讨论】:

标签: javascript regex google-apps-script google-docs add-on


【解决方案1】:

我稍微更改了您的示例以匹配文档中已有的内容。

代码如下:

function showIssues() {
  var body = DocumentApp
             .getActiveDocument()
             .getBody();
  
  const rules = {
    one: {
      match: 'Recipe 1',
      color: '#00FF00'
    },
    two: {
      match: 'Recipe 2',
      color: '#FF0000'
    }
  };
  var style1={};
  style1[DocumentApp.Attribute.FOREGROUND_COLOR]='#ff0000';
  for (const [rule, definition] of Object.entries(rules)) {
    let re=body.findText(definition.match).getElement().asText().setAttributes(style1);
  }
}

之前:

之后:

更新

我认为这更接近您的尝试。

function showIssues() {
  var body = DocumentApp
             .getActiveDocument()
             .getBody();
  var style1={};
  var style2={};
  style1[DocumentApp.Attribute.FOREGROUND_COLOR]='#ff0000';
  style2[DocumentApp.Attribute.FOREGROUND_COLOR]='#00ff00';
  const rules = {
    one: {
      match: 'Recipe 1',
      color: style1
    },
    two: {
      match: 'Recipe 2',
      color: style2
    }
  };
  var style1={};
  
  for (const [rule, definition] of Object.entries(rules)) {
    let re=body.findText(definition.match).getElement().asText().setAttributes(definition.color);
  }
}

【讨论】:

  • 它让我更接近。谢谢!我已经对其进行了调整,可以将颜色应用于单行文本(更好)而不是整个文档。但是,如果一行中有两个匹配项,则后一个匹配项决定颜色。
  • 我相信您可以使用与元素关联的两个偏移量来获得您想要的部分。我已经有一段时间没有使用它了,所以我不确定它是否可能
  • 非常非常接近。偏移量有帮助,但仅适用于给定元素的第一次匹配。因此,如果我有句子“这有一个 和两个 ”,则只有第一个 &lt;match&gt; 匹配。你知道我如何获得匹配列表而不是单个 rangeElement (re) 吗?
  • 没有元素你不能设置属性。
  • 或许你可以使用findElement(element type,from)
猜你喜欢
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多