应用程序脚本findText for docs

时间:2017-05-02 15:38:21

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

我知道Google Doc元素的findText函数并不使用常规正则表达式(而是使用RE2)。我遇到了一个正则表达式问题,其中一个经验证的,相对简单且看似支持的正则表达式块在应用程序脚本中自相矛盾地返回null结果。

想知道是否有人可以发现/解释原因。谢谢!

我将以下代码应用于block of text,并带有一些降价代码块标记(```)。当我将下面显示的正则表达式粘贴到具有类似代码块的regexer.com时,RegEx会返回正确的结果。但是,在我的doc上运行下面的代码会返回一个null结果。

我怀疑RE2中不支持我的代码中有一些正则表达式的元素,但是文档没有说明这一点。有什么想法吗?

var codeBlockRegEx = '`{3}((?:.*?\s?)*?)`{3}'; // RegEx to find (lazily) all text between triple tick marks (/`/`/`), inclusive of whitespace such as carriage returns, tabs, newlines, etc. var reWithCodeBlock = body.findText(codeBlockRegEx); // reWithCodeBlock evaluates to 'null'

1 个答案:

答案 0 :(得分:2)

我也收到了null - 我能够在段落中使用围绕单词test的3`来完成下面的工作。

我确实找到了这些信息: Apps脚本中Text类对象的findText方法,扩展了Google Docs。文档说“不完全支持JavaScript正则表达式功能的子集,例如捕获组和模式修饰符。”特别是,它不支持外观。

function findXtext() {
var body = DocumentApp.getActiveDocument().getBody();
  var foundElement = body.findText("`{3}(test)`{3}");

while (foundElement != null) {
    // Get the text object from the element
    var foundText = foundElement.getElement().asText();

    // Where in the element is the found text?
    var start = foundElement.getStartOffset();
    var end = foundElement.getEndOffsetInclusive();

    // Set Bold
    foundText.setBold(start, end, true);
  
   // Change the background color to yellow
    foundText.setBackgroundColor(start, end, "#FCFC00");

    // Find the next match
    foundElement = body.findText("`{3}(test)`{3}", foundElement);
   }
}