首页 > 解决方案 > 替换 Google Script 不支持的正则表达式

问题描述

我要实现的目标的简短背景:我有一个谷歌文档和一个谷歌表。google doc 包含文本,google sheet 包含 2 列:一个单词和它的翻译。该函数获取谷歌文档的正文并应该遍历“单词”col,识别正文中每个单词的所有外观并将其替换为翻译 - 但它仅匹配出现的完整单词和仅完全匹配. 基本上我想要的东西会更容易用一个例子来解释:假设我有“pop”这个词,它被翻译成“pretty”。我希望函数替换单词,但以下情况除外:

  1. 流行音乐
  2. 流行音乐
  3. 弹出
  4. ETC..

因此,基本上,只有在完全匹配且仅是整个单词的情况下才提到过。

这是函数,正则表达式工作正常,问题是谷歌脚本不支持它。我无法想出一个解决方案来替换我制作的正则表达式,而这个正则表达式可以工作并满足我的要求。我附上了代码,以防万一不清楚,如果您熟悉正则表达式,您将能够理解我的意思。

function replaceText(body, words, origin, translated) {

  for(var i=0; i<words.length; i++){
    var word = words[i][origin-1];
    var regex = RegExp("(?:\\b)" + word + "\\b(?!\\')",'gi');

    Logger.log(body.getText().match(regex));
    Logger.log(body.replaceText(regex, translation));
    var translation = words[i][translated-1];
    var foundElement = body.replaceText(regex, translation);
  }

  return body;
}

此外,如果您有兴趣,请附上 Google 脚本支持的正则表达式的链接: https ://github.com/google/re2/wiki/Syntax

标签: regexgoogle-apps-script

解决方案


首先,(?:\\b)应该只是\\b,单词边界无论如何都是零宽度,所以它不需要环顾四周。

其次,我了解您的问题与replaceText. 该行body.getText().match(regex);适用于常规的 JavaScript 字符串方法,它支持常用的正则表达式。问题是你需要replaceText,而那个是不同的。

第三,replaceText不将正则表达式对象作为参数:它的参数是字符串。再次检查文档

最后,由于我们不想将'其视为单词边界并且没有前瞻支持,因此解决方案是'通过将其替换为不会自然出现的足够奇怪的字母数字字符串来进行转义。最后,换回来。

function translate() {
  var body = DocumentApp.getActiveDocument().getBody();
  var escape = "uJKiy5hzXNUWFDl7k2pSZoDZ8ipv6LR1ArTi6gXu";  // from https://www.random.org/strings/?num=2&len=20&digits=on&upperalpha=on&loweralpha=on&unique=on&format=html&rnd=new
  body.replaceText("'", escape);
  // the loop would begin here
  var word = "pop";    
  body.replaceText("(?i)\\b" + word + "\\b", "translation");
  // loop would end here.
  body.replaceText(escape, "'");
}

请注意,不区分大小写的标志是(?i),并且替换replaceText始终是全局的。

并注意花撇号:如果它们也需要特殊处理,请以类似方式转义它们,但使用其他一些随机字符串。


推荐阅读