【问题标题】:Replacing Regex expression that is not supported with Google Script替换 Google Script 不支持的正则表达式
【发布时间】:2018-08-08 21:51:01
【问题描述】:

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

  1. 流行音乐
  2. 全能
  3. 弹出
  4. 等等..

所以基本上,只有当它是一个完全匹配并且只有一个完整的单词时才提到过。

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

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 Script 支持的正则表达式的链接: https://github.com/google/re2/wiki/Syntax

【问题讨论】:

  • @I'-'I 虽然我可能会误解 OP 的情况,但我认为当使用 \s 而不是 \b 时,例如,``word,`` 和 ``word。 ``无法匹配。

标签: regex google-apps-script


【解决方案1】:

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

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

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

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

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 中的替换始终是全局的。

并注意curly apostrophes:如果他们也需要特殊处理,请以类似方式对它们进行转义,但使用其他随机字符串。

【讨论】:

  • 嗨,我希望可以发表“谢谢”评论。它奏效了,仍然在为一些问题苦苦挣扎,但这绝对有帮助。谢谢!
猜你喜欢
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多