【问题标题】:Google App Scripts regex body.findText(searchPattern) returns null if new lines如果换行,Google App Scripts regex body.findText(searchPattern) 返回 null
【发布时间】:2019-12-09 23:38:31
【问题描述】:

这是一个 Google 文档内容:

Some text, more text...

<li>
some lines
more lines...
</li>

And more text

我想要一个 regex 来匹配:

<li>
...
</li>

到目前为止它返回null。我的正则表达式只找到&lt;li&gt;...&lt;/li&gt;,但没有找到新行,虽然我使用了建议的(?s) 标记以确保. 包含任何字符和新行:

(?s)&lt;li&gt;(.)*?&lt;/li&gt;

我的正则表达式在 https://regexr.com/https://regex101.com/ 中工作,所以我不明白它不在 Google App Script 中。

【问题讨论】:

  • Regex 非常不适合这样的任务。你应该使用 javascript 的 DOMParser。
  • 是的,我知道你是对的。我以为我只能在有效的 html 文件中使用 DOMParser,因为我的 Google 文档的内容将是一些 sn-ps 代码和普通文本的混合?
  • 它不需要特别是有效的 HTML,只要是格式良好的 XML。因此,只要有一个根元素并且嵌套内容遵循正确的 XML 语法,就可以了。

标签: javascript regex google-apps-script


【解决方案1】:
  • 您想在 Google 文档中检索 &lt;li ...&gt;....&lt;/li&gt; 的文本。
  • 您希望使用 Google Apps 脚本实现此目的。

如果我的理解是正确的,那么这个答案呢?请认为这只是几个可能的答案之一。

问题和解决方法:

在你的情况下,你想使用&lt;li sheet="[a-zA-Z0-9]*"&gt;[\s\S]*?&lt;\/li&gt;的模式,请修改为&lt;li sheet="[a-zA-Z0-9]*"&gt;[\\s\\S]*?&lt;\/li&gt;。在您的情况下,&lt;li ...&gt;....&lt;/li&gt; 有几个段落。 (根据您的示例值,我是这样想的。)由此,当const searchPattern = '&lt;li sheet="[a-zA-Z0-9]*"&gt;[\\s\\S]*?&lt;\/li&gt;' 的模式用于body.findText(searchPattern) 时,null 被返回。如果将&lt;li ...&gt;....&lt;/li&gt; 放在一个段落中,则body.findText(searchPattern) 返回&lt;li ...&gt;....&lt;/li&gt;

为了搜索有多个段落的&lt;li ...&gt;....&lt;/li&gt;,下面的解决方法如何?此变通方法的流程如下。

流程:

  1. 使用&lt;li sheet=&lt;\/li&gt; 作为搜索模式。
  2. 使用&lt;li sheet=的模式,检索&lt;li ...&gt;的开头段落。
  3. 使用&lt;\/li&gt;的模式,检索&lt;/li&gt;的结尾段落。
  4. 检索检索到的开头和结尾段落之间的文本。
  5. 此循环一直持续到搜索完所有 &lt;li ...&gt;....&lt;/li&gt; 值为止。

示例脚本:

function parseLists(body) {
  // var doc = DocumentApp.getActiveDocument();
  // var body = doc.getBody();

  var pattern1 = "<li sheet=";
  var pattern2 = "<\/li>";
  var range1 = body.findText(pattern1);
  var res = [];
  while (range1) {
    var temp = {};
    var p1 = range1.getElement().getParent();
    temp.startIndex = body.getChildIndex(p1);
    var range2;
    if (p1) {
      range2 = body.findText(pattern2, range1);
      var p2 = range2.getElement().getParent();
      temp.endIndex = body.getChildIndex(p2) + 1;
      var texts = "";
//      for (var i = temp.startIndex + 1; i < temp.endIndex - 1; i++) {
      for (var i = temp.startIndex; i < temp.endIndex; i++) {
        texts += body.getChild(i).asParagraph().getText();
      }
      temp.texts = texts;
      res.push(temp);
    }
    range1 = body.findText(pattern1, range2);
  }
  Logger.log(res)
}

结果:

当您的示例值被放入新的 Google 文档并运行脚本时,将检索到以下结果。

[
  {
    "startIndex": 0,
    "endIndex": 5,
    "texts": "<li sheet=\"experiences\">{{company_name}},  {{job_location}} — {{job_title}}MONTH {{from}} - {{to}}{{description}}</li>"
  },
  {
    "startIndex": 6,
    "endIndex": 9,
    "texts": "<li sheet=\"other\">{{test}}</li>"
  }
]
  • 对于上面的结果,如果你想在没有标签的情况下检索{{company_name}}, {{job_location}} — {{job_title}}MONTH {{from}} - {{to}}{{description}}{{test}}的值,请修改上面的脚本如下。

    • 发件人:

      for (var i = temp.startIndex; i < temp.endIndex; i++) {
      
    • 收件人:

      for (var i = temp.startIndex + 1; i < temp.endIndex - 1; i++) {
      

参考资料:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

【讨论】:

  • 您好田池,非常感谢您的回答。我肯定会使用其中的一部分,但我将问题的描述简化为仅关注 1 个问题:当... 具有任何字符(包括换行符)时匹配&lt;li&gt;...&lt;/li&gt;。 Google App Scripts 认为您建议的正则表达式无效。有什么想法吗?
  • @Greg Forel 感谢您的回复。我不得不为我糟糕的英语水平道歉。不幸的是,我无法理解您当前的The regex you suggested is considered invalid by Google App Scripts. 问题。因为在我的测试中,您的示例值可以与示例脚本一起使用。那么你能解释一下它的详细信息吗?我想考虑一下。
  • 抱歉,您的正则表达式确实有效。我在使用它时犯了一个错误。这有助于解决我的问题,再次感谢!
  • @Greg Forel 感谢您的回复。我很高兴你的问题得到了解决。如果您的问题得到解决,请按接受按钮。与您有相同问题的其他人也可以将您的问题作为可以解决的问题。我认为您的问题和解决方案将对他们有用。如果找不到按钮,请随时告诉我。 stackoverflow.com/help/accepted-answer
猜你喜欢
  • 2018-03-06
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 2019-12-30
相关资源
最近更新 更多