【问题标题】:Extract all tags from a Google Document using a lazy regex使用惰性正则表达式从 Google 文档中提取所有标签
【发布时间】:2018-05-11 13:00:37
【问题描述】:

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

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

它记录&lt;dear&gt; &lt;person&gt; 而不仅仅是&lt;dear&gt;。 我猜由于某种原因,匹配在“惰性”模式下不起作用,但我在https://regex101.com 上运行它,它将两个标签显示为两个不同的匹配项。

我做错了什么?

【问题讨论】:

  • 然后使用&lt;[^&gt;&lt;]*&gt;

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


【解决方案1】:

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

要正确提取匹配文本,使用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 方法中不是。这就是 end+1slice 中的原因。
  • 循环是返回所有结果所必需的。 findText 仅找到一个匹配项,此处称为 found。然后将此匹配作为第二个参数传递给findText,以便找到下一个匹配。

【讨论】:

  • 很好,非常感谢。文档对返回的确切内容不是很清楚,所以我猜这是每个元素一个结果。我没有足够的声誉来投票。谢谢。
猜你喜欢
  • 2019-07-02
  • 2011-10-07
  • 2018-05-08
  • 2010-09-23
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多