使用惰性正则表达式从 Google 文档中提取所有标签

Extract all tags from a Google Document using a lazy regex

我有一份 Google Docs 文档,其中包含 <dear> <person> 行,我希望 FindText 一次 return 一个标签。我用这条线:

Logger.log(body.findText("<.*?>").getElement().getText());

它记录 <dear> <person> 而不仅仅是 <dear>。 我想由于某种原因,匹配在 "lazy" 模式下不起作用,但我在 https://regex101.com 上 运行 它显示了两个标签作为两个不同的匹配项。

我做错了什么?

问题不在于懒惰,而是在于懒惰。你的正则表达式 懒惰的。方法 findText returns a RangeElement,其中包含有关比赛开始和结束的信息。问题是您调用了 getElement,return 是包含匹配项的整个元素。所以结果是包含匹配文本的整个段落(或另一个元素)。

要正确提取匹配文本,请使用isPartial检查匹配是否只是元素的一部分;如果是这样,请获取开始和结束位置并将文本切片,如下所示。

function search() {
  var body = DocumentApp.getActiveDocument().getBody();
  var pattern = "<.*?>";
  var found = body.findText(pattern);
  while (found) {
    var text = found.getElement().getText();
    if (found.isPartial()) {
      var start = found.getStartOffset();
      var end = found.getEndOffsetInclusive();
      text = text.slice(start, end+1);
    }
    Logger.log(text);
    found = body.findText(pattern, found);
  }
}

备注:

  • 在 Apps 脚本中,结束偏移量是包含在内的;在 String.slice 方法中不是。这就是 slice.
  • end+1 的原因
  • 循环是 return 所有结果所必需的。 findText 只找到一个匹配项,这里称为 found。然后这个匹配被传递给 findText 作为它的第二个参数,所以它找到 next 匹配。