【问题标题】:Double asterisk regex reports as invalid双星号正则表达式报告为无效
【发布时间】:2014-02-25 19:15:41
【问题描述】:

我正在尝试使用findText 和正则表达式在一对两个星号(即**This text, please**)之间查找无法确定的文本数量,包括标点符号。然后脚本应该对星号和随附的文本起作用。我的代码如下:

function main() {
  var search = body.findText('(\*\*)+([.*]+)+(\*\*)');
  if (search === null) {
    DocumentApp.getUi().alert('No text was found that required formatting.');
  } else {
    function second() {
      if (search !== null) {
        search = body.findText('(\*\*)+([.*]+)+(\*\*)');
        search.setBold(true);
        body.replaceText('\*\*','');
        second();
      } else {
        DocumentApp.getUi.alert('Formatting completed!');
    }
  };
}
};

我正在假设findText 只找到搜索模式的第一个实例。 现在,我完全知道由于不支持捕获组,我的正则表达式将不起作用,但是还有什么其他方法可以“短语”,例如搜索?如果不能用单个正则表达式完成,是否可以通过三个单独的带有偏移量的搜索来做到这一点?

【问题讨论】:

  • 您的 .findText 正则表达式对于双星号之间的匹配不正确。它应该更像:\*\*(.*)\*\*.
  • 此外,.findText 将返回 true 或 false。你应该检查真假。不是“空”。
  • 什么是.replaceText()?这是来自其他插件或脚本的功能吗?只使用 javascript .replace() 怎么样?和 search.setBold()?你在一个布尔值上调用 .setBold() (不管是什么)..你的代码有太多问题..
  • @MElliott 我首先尝试了初始代码,但如前所述,函数.findText 不支持捕获组。此外,.findText 作为字符串值返回(这让我想知道这是否真的会按预期工作,以及可以使用哪些其他方法)。这里记录了正在使用的函数:developers.google.com/apps-script/reference/document/…

标签: javascript regex google-apps-script


【解决方案1】:

很遗憾地宣布,您尝试执行的操作似乎是不可能的。正如documentation 中所说,函数 findText 不支持任何正则表达式,并且您正在构建的那个看起来不受支持。
这是我对您的正则表达式的重新表述:http://regex101.com/r/eN6vT9:*{2}.*?*{2}
但是由于不支持它的限制,我唯一可以匹配的是单星。
此外,当您找到匹配项时,将匹配项以粗体显示的操作不起作用。它加粗了所有段落。我在这里找到的唯一可能的解决方法是提取文本对提取的文本执行正则表达式并替换所有内容,但在这种情况下,您将失去所有其他文本格式(我想这不是您要寻找的)。
在我使用的代码下方(不完全正常)

function main() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  Logger.log(body.getText());
//  body.setText("toto est content et il va ajouter des double stars ** et encore ** et encore **");
//  var search = body.findText('\*{2}.*?\*{2}');
  var pattern = '/(\*\*)/';
   var search = body.findText(pattern);
  Logger.log(search);
  if (search == null) {
   // DocumentApp.getUi().alert('No text was found that required formatting.');
  } else {
    var style = {};
    style[DocumentApp.Attribute.BOLD] = true;
    search.
    search.getElement().setAttributes(style);
//    body.replaceText('\*\*','');
   // DocumentApp.getUi().alert('Formatting completed!');
  }
}

【讨论】:

  • 奇怪的是该模式应该只返回一个。也许一个单独的 .findText 函数可能是合适的?类似于:var one = body.findText('\*'); var two = body.findText('\*',one); var content = body.findText('.*\*',two); // [whatever bold code becomes appropriate]; body.replaceText('\*\*',''); 当然,这将依赖于第一个正则表达式按预期工作(不太可能)并且只会选择第一个实例,考虑到.replaceText 在整个身体中工作,这可能不起作用。
猜你喜欢
  • 2022-07-27
  • 1970-01-01
  • 2019-08-04
  • 2018-03-07
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
相关资源
最近更新 更多