首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用包含数字的标识符替换编号列表元素

如何用包含数字的标识符替换编号列表元素
EN

Stack Overflow用户
提问于 2020-08-23 03:11:20
回答 1查看 171关注 0票数 0

我今天在这里得到了惊人的帮助!

我想做点别的。我在Google中有一个编号的问题列表,我想用其他的东西来替换这些数字。

例如,我想替换列表中的数字,如:

  1. 地球离太阳最近,一年中哪个月?~七月~六月=一月~三月~九月。
  2. 在澳大利亚(南半球),白天是最短的,夜晚是最长的?~12月底~3月底=6月底~4月底~白天和黑夜在澳大利亚全年几乎相同。

通过以下方式:

*Q09::地球在一年的哪个月离太阳最近?~7月~6月=1月~3月~9月

::问题11:在澳大利亚(南半球),白天是最短的,夜晚是最长的?~在12月底~3月底=6月底~4月底~白天和夜晚在澳大利亚全年几乎一样长

我尝试过使用以前的帖子中的建议,但只想出了如下这样的东西,这似乎不起作用。

谢谢你在这里!

代码语言:javascript
复制
function questionName2(){
  var body = DocumentApp.getActiveDocument().getBody();
  var text = body.editAsText();
    var pattern = "^[1-9]";
    var found = body.findText(pattern);
    var matchPosition = found.getStartOffset();
  
  while(found){
    text.insertText(matchPosition,'::Q0');
    found = body.findText(pattern, found);
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-23 12:53:26

正则表达式

Text.findText(searchPattern)使用一个字符串,该字符串将被解析为正则表达式,使用谷歌的RE2库作为searchPattern。以这种方式使用字符串时,每当从字符中删除特殊意义时,我们都需要添加一个额外的反斜杠,例如匹配问号后面的句点,或者对数字使用像\d这样的字符匹配集。

^\\s*\\d+?\\.将匹配一组数字,其长度为任何非零长度,以任何长度(包括零)的前导空格开始行。\d代表数字,+是一个或多个,组合+?使匹配变懒。这里不需要懒惰部分,但我的习惯是默认懒散以避免bug。另一种选择是专门匹配1到2位数字的\d{1,2}

要从匹配的文本中仅提取数字,我们可以使用JavaScript RegExp对象。与Doc正则表达式不同,这个正则表达式不需要额外的反斜杠,并且允许我们使用括号捕获组。

^\s*(\d+?)\.几乎和上面一样,除了没有多余的斜杠之外,我们现在将“保存”这些数字,以便我们可以在替换字符串中使用它们。我们使用括号标记要保存的内容。因为这将是一个普通的JavaScript正则表达式文字,所以我们将用斜杠:/^\s*(\d+?)\./包装整件事情,但是开始和结束/只是表示这是一个RegExp文本。

文本元素和文本字符串

Text.findText可以返回的不仅仅是我们所要求的完全匹配:它返回包含文本的整个元素加上正则表达式匹配的索引。为了执行搜索和替换捕获组,我们必须使用索引删除旧文本,然后插入新文本。

下面的分配为我们提供了执行搜索和替换所需的所有数据:首先是元素,然后是开始和停止索引,最后是使用slice提取匹配的文本字符串(注意,片使用排它的端,而Doc使用包含的端,因此是+1)。

代码语言:javascript
复制
var found = DocumentApp.getActiveDocument().getBody().findText(pattern);
var matchStart = found.getStartOffset();
var matchEnd = found.getEndOffsetInclusive();
var matchElement = found.getElement().asText();
var matchText = matchElement.getText().slice(matchStart, matchEnd + 1);

注意事项

正如Tanaike在注释中指出的那样,这假设编号不是列表项目,它自动生成数字,而是手动输入的数字。如果使用的是自动生成的数字列表,则API不允许您编辑编号格式。

这个答案还假设在示例中,当您映射“9”时。致::Q09::“和”10到"::Q11::",10到11的映射是一个错误。如果这是有意的,请更新问题,以澄清为什么编号可能改变的规则。

还假定数字应该小于100,给出"Q09“的零填充示例。该示例应该足够灵活,允许您在需要时将其更新为不同的填充方案。

全例

因为这个问题没有使用任何V8特性,所以这假设是旧的Rhino环境。

代码语言:javascript
复制
/**
 * Replaces "1." with "::Q01::"
 */
function updateQuestionNumbering(){
  var text = DocumentApp.getActiveDocument().getBody();
  var pattern = "^\\s*\\d+?\\.";
  var found = text.findText(pattern);
  while(found){
    var matchStart = found.getStartOffset();
    var matchEnd = found.getEndOffsetInclusive();
    var matchElement = found.getElement().asText();
    var matchText = matchElement.getText().slice(matchStart, matchEnd + 1);
    matchElement.deleteText(matchStart, matchEnd);
    matchElement.insertText(matchStart, matchText.replace(/^\s*(\d+?)\./, replacer));  
    found = text.findText(pattern, found);
  }
  
  /**
   * @param {string} _ - full match (ignored)
   * @param {string} number - the sequence of digits matched
   */
  function replacer(_, number) {
    return "::Q" + padStart(number, 2, "0") + "::";
  }
  
  // use String.prototype.padStart() in V8 environment
  // above usage would become `number.padStart(2, "0")`
  function padStart(string, targetLength, padString) {
    while (string.length < targetLength) string = padString + string;
    return string;
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63543020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档